C ++,命令行,参数

时间:2011-03-11 11:52:18

标签: c++ command-line parameters

我从命令行启动我的c ++程序:

program input_file1 input_file2 output_file

,其中

int main( int argc, char *argv[] )
{
    short indicator= 3;
    char input_file1[4096], input_file2[4096], output_file[4096];
    char *p_file = NULL;
    while ( --argc > 0 ) {
        switch (--indicator) {
          case 2:
            p_file = output_file;
            break;
          case 1:
            p_file = input_file2;
            break;
          case 0:
            p_file = input_file1;
            break;
        }

        for (char *argument = argv[argc]; ; ++argument) {
            if (*argument == '\0')
                break;
            else
                *p_file++ = *argument;
        }

        *p_file = '\0'; 
    }

    std::cout << input_file1 << '\n';
    std::cout << input_file2 << '\n';
    std::cout << output_file << '\n';
}

但是有了真实的论点

program D:\\data\\file1.txt D:\\data\\file2.txt D:\\data\\file3.txt

在文件名中只存储第一个字母D ......

Output:
D
D
D

感谢您的帮助......

5 个答案:

答案 0 :(得分:9)

好的,这是短版本:

int main(int argc, char *argv[]) {
    if (argc != 2) {
        std::cout << "This program requires 1 argument!" << std::endl;
        return 1;
    }
    std::string input_file(argv[1]);
    std::cout << input_file << std::endl;
}

你应该可以从这里拿走它。

答案 1 :(得分:7)

这是一个C问题,而不是C ++问题,但是因为它标记为C ++,我将为您的问题建议一个C ++解决方案:

int main( int argc, char *argv[] ) {
     std::vector<std::string> args(argv+1, argv+argc);
     std::cout << args[0] << '\n' << args[1] << '\n' << args[2] << std::endl;
}

UPDATE 使用argv上的迭代器来填充向量参数(感谢Space_C0wb0y)

答案 2 :(得分:4)

不要复制参数,只需将文件名设置为指向argv中的相应条目。

int main(int argc, char *argv[]) {
    char *input_file1, *input_file2, *output_file; 

    if (4 > argc)
    {
        std::cout << "Not enough parameters\n";
        return -1;
    }
    input_file1 = argv[1];
    input_file2 = argv[2];
    output_file = argv[3];

    std::cout << input_file1 << '\n';
    std::cout << input_file2 << '\n';
    std::cout << output_file << '\n'; 
}

只要程序正在运行,argv的内容就会存在。

答案 3 :(得分:2)

*p_file ++ = * argument; 

这会将参数的第一个字符分配给p_file中的第一个字符。

您需要使用strcpy,或声明一些std::strings而不是char数组

答案 4 :(得分:0)

您的循环全错了。您正在遍历字符,而不是参数数组。您可以这样做:

for(auto arg = argv + 1; *arg; ++arg)
{
    std::cout << (*arg) << '\n'; // *arg is a char*
}

之所以可行,是因为参数(如果有的话)以argv + 1开头,并且以 null终止,因此*argnullptr(转换为{{ 1}})放在参数数组的末尾。

您的参数是通过使用falsearg)对*arg解引用来获得的。

因此您可以这样做:

char*