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

How to concatenate command line arguments with separator

本文关键字:命令行 参数 连接 分隔符 何使用      更新时间:2023-10-16

我从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:"<":没有从"字符**"转换为"int">

此错误从何而来?

一个简单的方法:

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

您得到的编译器错误是因为您在 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 ... ( 开始迭代。这将跳过始终是可执行文件名称的第一个参数。