我可以使用 std::string* argv 作为主函数参数吗?
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
.
不,你不能。但是您可以使用类似下面的内容将它们存储为 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;
}
main
参数必须是 char** argv
或 char* argv[]
.
2. An implementation shall not predefine the main
function.
This function shall not be overloaded.
Its type shall have C++ language linkage and it shall have a declared return type of type int
, but otherwise its type is implementation-defined.
An implementation shall allow both
(2.1).
a function of ()
returning int
and
(2.2).
a function of (int, pointer to pointer to char)
returning int
您可以使用以下方法之一转换代码中的参数:
- 简单赋值:
if(argc > 1)
{
std::string str = argv[1];
}
- 使用参数作为构造函数参数构造字符串:
std::string str(argv[1]);
- 带有初始化列表:
std::string str{argv[1]};
如果您想保留一组参数,我建议您使用以下方法之一将它们保存在可变大小的容器中 std::vector
:
- 使用
std::vector
构造函数就地构造向量,这里使用指向字符串数组 argv
开头和结尾的指针作为构造函数参数:
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
constructor 创建一个 std::vector<std::string>
:
template< class InputIt >
vector( InputIt first, InputIt last, const Allocator& alloc = Allocator());
所以要将参数(不包括程序名)放在 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*[]
}
通常我看到:
int main(int argc, char** argv)
但是我可以使用:
int main(int argc, std::string* argv)
代替?
如果无法将 char*
转换为 std::string
?
PS: 我正在使用 C++11
.
不,你不能。但是您可以使用类似下面的内容将它们存储为 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;
}
main
参数必须是 char** argv
或 char* argv[]
.
2. An implementation shall not predefine the
main
function. This function shall not be overloaded. Its type shall have C++ language linkage and it shall have a declared return type of typeint
, but otherwise its type is implementation-defined. An implementation shall allow both(2.1). a function of
()
returningint
and(2.2). a function of
(int, pointer to pointer to char)
returningint
您可以使用以下方法之一转换代码中的参数:
- 简单赋值:
if(argc > 1)
{
std::string str = argv[1];
}
- 使用参数作为构造函数参数构造字符串:
std::string str(argv[1]);
- 带有初始化列表:
std::string str{argv[1]};
如果您想保留一组参数,我建议您使用以下方法之一将它们保存在可变大小的容器中 std::vector
:
- 使用
std::vector
构造函数就地构造向量,这里使用指向字符串数组argv
开头和结尾的指针作为构造函数参数:
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
constructor 创建一个 std::vector<std::string>
:
template< class InputIt >
vector( InputIt first, InputIt last, const Allocator& alloc = Allocator());
所以要将参数(不包括程序名)放在 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*[]
}