如何使用分隔符连接命令行参数

时间:2017-04-09 11:09:53

标签: c++

我从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;

这个错误来自哪里?

2 个答案:

答案 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';