好的,我需要编写一个处理和比较命令行参数的C程序。例如,假设程序名为test.c.我按照以下方式执行:./test 加载 商店 一两个 加载商店 ......等我的意思是,当有一个“加载”命令时,它将解析argc + 1并对其执行某些操作,并且当存在“存储”命令时goind做其他事情并解析argc + 1和argc + 2。 到目前为止,赫雷斯是我的方法:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct Tooks {
char s1[50];
char s2[50];
char s3[50];
} Test; /*use this struct to compare the command line arguments in
which in am interested at every time. */
int main (int argc, char *argv){
int num = argc;
int y,i;
char args[num][50]; /*use this num-places array with each string
containing 50 chars. I did that because if i try directly to
strcpy( test.s1, argv[i]) i would get a seg fault. */
Test test;
strcpy( test.s1, "null");
strcpy( test.s2, "null");
strcpy( test.s3, "null");
for (y=0; y<num; y++){
strcpy(args[y], "null");
}//"initializing" the array as null
for (i=1; i<num;){
//copy the 3 command line arguments.
strcpy( test.s1, args[i]);
strcpy( test.s2, args[i+1]);
strcpy( test.s3, args[i+2]);
printf("s1 %s, s2 %s, s3 %s, num %d\n", test.s1, test.s2, test.s3, num);//Just a test print
if (strcmp(test.s1, "store")==0 && strcmp(test.s2, "null") != 0 && strcmp(test.s3, "null") != 0){
printf("%s\n, %s\n", test.s2, test.s3);
i=i+3;
}
else if (strcmp(test.s1, "load")==0 && strcmp(test.s2, "null") != 0){
printf("%s\n", test.s2);
i=i+2;
}
else {
printf("nothing\n");
printf("s1 %s, s2 %s, s3 %s\n", test.s1, test.s2, test.s3);
i++;
}
}
printf("end %d\n", argc);
return 0;
}
这是输出:
s1 null, s2 null, s3 null, num 6
nothing
s1 null, s2 null, s3 null
s1 null, s2 null, s3 null, num 6
nothing
s1 null, s2 null, s3 null
s1 null, s2 null, s3 null, num 6
nothing
s1 null, s2 null, s3 null
s1 null, s2 null, s3 �, num 6
nothing
s1 null, s2 null, s3 �
s1 null, s2 �, s3 , num 6
nothing
s1 null, s2 �, s3
end 6
命令 ./test加载一两个商店
似乎命令行参数既没有传递给结构也没有传递给数组。 有任何想法吗? :)
答案 0 :(得分:1)
您的代码有几个问题。
你永远不会用“null”之外的东西填充args。您继续将“null”字符串复制到您的结构中,这就是它打印的内容。
您永远不会引用argv,它是将可执行文件名存储在索引0中的数组,并使用您在命令行中提供的任何内容填充其余部分。
Argv应该是
char* argv[]
而不是
char* argv
答案 1 :(得分:0)
有用于解析命令行的库,例如this answer。
如果你想自己做,它看起来像
for (int i = 1; i<argc; i++){
if (!strcmp(argv[i], "load")) {
if (i+1<argc) {
handle_load(argv[i+1]);
i+=1;
}
else {
show_error("`load` needs 1 value");
}
}
else if (!!strcmp(argv[i],"store")) {
//similar, but with 2 next aruments
}
else {
show_error("invalid option %s", argv[i]);
}
}