C ++ linux argv dash参数

时间:2012-11-28 12:50:36

标签: c++ linux string

我一直在尝试使用Linux上的C ++控制台应用程序。

我想根据用户使用的参数更改用户的选项。

赞:./my -n 1234./my -f file.txt

-n或-f总是argv [1] 1234或file.txt始终是argv [2]

我的主要()

int main(int argc, char *argv[])

到目前为止,这是我的代码:

string numlist, num;


if (argc < 3) {
   fprintf(stderr,"usage stuff...%s %s", argv[0], argv[0]);
   exit(0);
}

char *f = "-f";
char *n = "-n";
char *argv0 = argv[0];
char *argv1 = argv[1];
char *argv2 = argv[2];

if (strcmp(argv1, f) == 0){
    numlist = argv[2];
    //more data for this parameter
}

if (strcmp(argv1, n) == 0){
    num = argv[2];
    //more data for this parameter
}

问题:

当我尝试./my -n 1234时 这应该跳过第1个if块,然后执行第2个if块 或./my -f file.txt
应执行第一个if块,并跳过第二个if块。

现在使用我当前的代码,如果我输入-n或-f,它会跳过所有if块。

- 编辑 -
我想我修好了问题实际上并不是在argv上,而是在我的if块上。

谢谢大家,我会检查你的所有建议。

4 个答案:

答案 0 :(得分:1)

this有帮助吗?它看起来像是一种解析命令参数的简洁方法。

(还有一个更复杂的one,虽然我认为第一个是足够好的)

答案 1 :(得分:0)

我不知道你的完整源代码是什么,但这对我有用:

#include <string.h>
#include <string>
#include <stdio.h>

using namespace std;

int main(int argc, char **argv){

    if (argc < 3) {
       fprintf(stderr,"usage stuff...%s %s", argv[0], argv[0]);
       exit(0);
    }

    string numlist;
    string num;

    char *f = "-f";
    char *n = "-n";
    char *argv0 = argv[0];
    char *argv1 = argv[1];
    char *argv2 = argv[2];


    if (strcmp(argv1, f) == 0){
        numlist = argv[2];
       //more data for this parameter
    }

    if (strcmp(argv1, n) == 0){
        num = argv[2];
    //more data for this parameter
    }
}

我添加了using namespace std以便更容易编写代码,同时我已将验证移到顶部,因为如果argv [2]不存在,则会抛出错误。

答案 2 :(得分:0)

除非你想为自己做这个练习,否则你应该使用库函数。

沃尔特已经提到boost::program_options。如果您不想使用Boost,您还可以查看getopt,这是一个久经考验的C库函数。

答案 3 :(得分:0)

在if-clauses中添加一些输出语句,比如printf("this is option -f\n"),我敢打赌你会发现它不会跳过两个if-bodies,只有一个。

看起来你对C ++中的字符串处理不是很熟悉。查找std::string,了解如何使用字符串比使用char*更轻松。我认为使用boost最好留给更有经验的程序员,但是你可以尝试一下,