我从argv读取了参数,我想将它们只放入一个字符串中。
例如,如果参数是:man
ls
-la
,那么我想在一个字符串中获取命令字符串"man ls -la"
以下是我目前的情况:
#include <string>
int main(int argc, char**argv) {
string command;
for (int i = 1; i<argv; i++) {
command += argv[i];
}
my_function(command);
}
command
应包含由空格分隔的所有参数:
这是对的吗?
我也有编译错误:
错误C2446:&#39;&lt;&#39;:没有来自&#39; char **&#39;到&#39; int&#39;
这个错误来自哪里?
答案 0 :(得分:0)
你得到的编译错误是因为你在for {而不是argv
中使用argc
,这是正确的版本:
for(int i = 1; i < argc;i++) {...}
您还需要在每个参数后添加一个空格(最后一次除外)
for (int i = 1; i<argc; i++) {
command += argv[i];
if (i != argc-1) //this check prevents adding a space after last argument.
command += " ";
}
或在每个参数之前添加空格(第一次除外)
for (int i = 1; i<argc; i++) {
if (i != 1)
command += " ";
command += argv[i];
}
请注意,您从第一个元素(for(int i = 1 ...
)开始迭代。这会跳过始终是可执行文件名的第一个参数。
答案 1 :(得分:0)
一种简单的方法:
std::string argument;
std::for_each( argv + 1, argv + argc , [&]( const char* c_str ){ argument += std::string ( c_str ) + " "; } );
std::cout << argument;
或写下join
函数:
struct Join{
template< typename Container >
std::string operator()( Container first, Container last,const std::string& delimiter = " " ){
std::ostringstream oss;
while( first != last ){
( ( first + 1 ) != last ) ? ( oss << *first << delimiter ) : ( oss << *first );
++first;
}
return oss.str();
}
}join;
用法:
std::string result = join( argv + 1, argv + argc );
std::cout << result << '\n';