我一直在尝试使用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块上。
谢谢大家,我会检查你的所有建议。
答案 0 :(得分:1)
答案 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最好留给更有经验的程序员,但是你可以尝试一下,