2017-04-09 83 views
0

我从argv中读取参数,并且只想将它们放入一个字符串中。 例如,如果参数是:manls-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应该包含所有由一个单独的参数空间:

这是正确的吗?

我也有一个编译器错误:

error C2446: '<': no conversion from 'char **' to 'int'

这哪里是错误来的呢?

+0

你没有问一个问题。你有什么尝试?这是任何教程都会涉及的东西。另外,请不要标记c和C++。这是什么? – Carcigenicate

+0

C++。我的问题是:我如何可以从argv获得所有参数为只有一个字符串。如果参数是:argv [1] =“man”,argv [2] =“ls”,argv [3] =“-la”我如何使用name命令存储所有3到1个字符串,以便我有命令=“man ls -la”? – Joe4444

+0

你显示的代码有什么问题?如果你打印'command',期望值是多少?什么是实际价值?请花一些时间[阅读如何提出好问题](http://stackoverflow.com/help/how-to-ask)。 –

回答

0

你的编译器错误是因为您在使用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 ...)。这会跳过始终是可执行文件名称的第一个参数。

+0

argv [0]是可执行文件的名称,因此OP是以1开头的权利 –

+0

我没有看到任何说人是可执行文件的名称,只是“参数是:man ls -la“ –

+0

我再次看不到任何连接。 OP没有提到人是可执行的名字,更不用说man命令了。 –

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'; 
+1

非常感谢你们:)! – Joe4444