![](/img/trans.png)
[英]How do I pass an argument that was passed to main (in argv) to my function?
[英]Can I use std::string* argv as main function argument?
通常我會看到:
int main(int argc, char** argv)
但我可以使用:
int main(int argc, std::string* argv)
反而?
如果不可能,我如何將char*
轉換為std::string
?
PS:我正在使用C++11
。
main
參數必須是char** argv
或char* argv[]
。
2. 一個實現不應預定義
main
function。 此 function 不得超載。 其類型應具有 C++ 語言鏈接,並且應具有聲明的返回類型int
,否則其類型是實現定義的。 一個實現應允許兩者(2.1)。
()
的 function 返回int
和(2.2)。
(int, pointer to pointer to char)
的function返回int
您可以做的是使用以下方法之一轉換代碼中的 arguments:
if(argc > 1)
{
std::string str = argv[1];
}
std::string str(argv[1]);
std::string str{argv[1]};
如果您想保留 arguments 的集合,我建議您使用以下方法之一將它們保存在可變大小的容器std::vector
中:
std::vector
構造函數就地構造向量,這里使用指向字符串數組argv
開頭和結尾的指針作為構造函數 arguments: std::vector<std::string> strs(&argv[1], &argv[argc]); //*
std::vector<std::string> strs{&argv[1], &argv[argc]}; //*
std::vector<std::string> strs;
for(int i = 1; i < argc; i++) //*
strs.push_back(argv[i]);
}
*不包括argv[0]
程序名稱。
在論文P0781中,Erich Keane 建議讓標准允許以下內容:
int main(const some_container<const some_string_type> args){
for (auto Arg : args) {
// some usage of this character array...
}
}
存在應該使用哪個容器和哪個字符串類型的問題。 Keane 先生建議使用string_view
的initializer_list
- 而不是std::string
,因為后者需要大量資源,而string_view非常輕量級。
不,但是您可以使用帶有迭代器的vector
構造函數來創建std::vector<std::string>
:
template< class InputIt >
vector( InputIt first, InputIt last, const Allocator& alloc = Allocator());
因此,將 arguments(不包括程序名稱)放在一個vector
中:
std::vector<std::string> args(argv + 1, argv + argc);
要將您的普通main
與增強main
服務器分開,您可以這樣做:
#include <iostream>
#include <string>
#include <vector>
int cppmain(std::string program, std::vector<std::string> args) {
std::cout << program << " got " << args.size() << " argument(s):\n";
for(auto& arg : args) { // each argument as a string
std::cout << " " << arg << '\n';
}
return 0;
}
int main(int argc, char* argv[]) {
//
// string from char*
// |
// V
return cppmain(argv[0], {argv + 1, argv + argc});
// ^ ^
// | |
// vector<string> from char*[]
}
不,你不能。 但是您可以使用類似以下的內容將它們存儲為std::string
s
#include <iostream>
#include <string>
#include <vector>
int main(int argc,char** argv){
std::vector<std::string> strings(argc-1);
for(size_t i{}; i < strings.size();++i){
strings[i] = std::string{argv[i+1]};
}
for(const auto& el :strings)
std::cout << el << " ";
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.