1

我一直在尝试在 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
这应该跳过第一个 if 块,然后执行第二个 if 块。
./my -f file.txt
应该执行第一个 if 块,并跳过第二个 if 块。

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

-- 编辑 --
我想我已经解决了问题实际上不在 argv 上,而是在我的 if 块上。

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

4

4 回答 4

1

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

(还有一个更复杂,虽然我认为第一个已经足够好了)

于 2012-11-28T13:00:57.890 回答
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] 不存在,它将引发错误。

于 2012-11-28T13:04:11.793 回答
0

除非您想将其作为自己的练习,否则您可能应该为此使用库函数。

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

于 2012-11-28T13:14:15.060 回答
0

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

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

于 2012-11-28T13:21:08.503 回答