有人可以解释以下代码中发生的事情吗?
if( strncmp( argv[i], cascade_opt, cascade_opt_len) == 0 )
cascade_name = argv[i] + cascade_opt_len;
我的猜测是这两行检查用户键入了什么类型的级联(因此argv [i])然后如果第一个cascade_opt_len字符相同,它会连接argv [i]和cascade_opt_len。但是,对于我来说,为什么将名称与整数连接起来似乎没有意义呢?
此外,
if( argv[i][nested_cascade_opt_len] == '=' )
我一直认为最argv [i]可以是一维数组,记录用户键入的内容。但不知何故,这条线使得它看起来像argv [i]可以是2D数组。有人能够启发我的实际意义吗?
答案 0 :(得分:2)
if( strncmp( argv[i], cascade_opt, cascade_opt_len) == 0 )
^ ^ ^
这可能会检查argv [i]常量第一个子串等于cascade_opt
而cascade_opt_len
长度为cascade_opt
下一行:
cascade_name = argv[i] + cascade_opt_len;
^ points to string after sub string in `cascade_opt`
这只是一种解析字符串的方法:
为了更清楚地了解代码中发生了什么,我编写了一个代码:
int main (int argc, char* argv[]){
char *cascade_name = NULL;
char* cascade_opt = "nameIs";
int cascade_opt_len = strlen(cascade_opt);
int i = 1;
if( strncmp( argv[i], cascade_opt, cascade_opt_len) == 0 )
cascade_name = argv[i] + cascade_opt_len;
printf("\ncascade_name is: %s ", cascade_name);
printf("\n");
return 0;
}
让我们执行它(但在代码中注意i = 1):
~$ ./a.out nameIsGrijesh
cascade_name is: Grijesh
现在在if语句cascade_name
指向'Grijesh'argv [1]中的最后一个子字符串之后。
好的,我使用循环扩展此代码以解析每个输入命令行参数:
int main (int argc, char* argv[]){
char *cascade_name = NULL;
char* cascade_opt = "nameIs";
int cascade_opt_len = strlen(cascade_opt);
int i = 1;
for(i=1; i < argc; i++){
if( strncmp( argv[i], cascade_opt, cascade_opt_len) == 0 ){
cascade_name = argv[i] + cascade_opt_len;
printf("\ncascade_name is: %s ", cascade_name);
}
}
printf("\n");
return 0;
}
现在看看代码运行的是什么:
grijesh@hp:~$ ./a.out nameIsGrijesh nameIsB.rabbit mynameIsXX nameIsStackOverflow
cascade_name is: Grijesh
cascade_name is: B.rabbit
cascade_name is: StackOverflow
你明白为什么XX
没有印刷?
修改强>
好的== '='
我的第三个代码会有所帮助:尝试理解输出:
int main (int argc, char* argv[]){
char *cascade_name = NULL;
char* cascade_opt = "nameIs";
int cascade_opt_len = strlen(cascade_opt);
int nested_cascade_opt_len = strlen(cascade_opt);
int i = 1;
for(i=1; i < argc; i++){
if( strncmp( argv[i], cascade_opt, cascade_opt_len) == 0 ){
cascade_name = argv[i] + cascade_opt_len;
printf("\ncascade_name is: %s ", cascade_name);
}
if( argv[i][nested_cascade_opt_len] == '=' ){
cascade_name = argv[i] + nested_cascade_opt_len + 1;
printf("\nfom second potion is: %s ", cascade_name);
}
}
printf("\n");
return 0;
}
输出是:
:~$ ./a.out nameIsGrijesh nameIsB.rabbit myname=XX nameIsStackOverflow
cascade_name is: Grijesh
cascade_name is: B.rabbit
fom second option is: XX
cascade_name is: StackOverflow
答案 1 :(得分:1)
对于你的第一个例子,它正在查看argv的项目'i',并询问它是否以cascade_opt
中包含的字符串开头。如果是,则将cascade_name
设置为余数。因此,如果包含cascade_opt
,例如--cascade=
,则argv [i]包含--cascade=foo', cascade_name would end up pointing to
foo`。
对于第二个问题,请将argv
视为char * []。一旦选择了一个char *,就可以使用[]来索引字符串中的字符。
答案 2 :(得分:0)
cascade_name = argv[i] + cascade_opt_len;
argv
的类型为char **
。对其进行索引意味着argv[i]
的类型为char *
- 即字符串。向char *
添加整数会使指针前进这么多字符。这可以写得更清楚:
cascade_name = &argv[i][cascade_opt_len];
它修剪了 i 参数casecade_opt_len
中的第一个argv[i]
个字符,并将剩余的字符串分配给cascade_name
。
if( argv[i][nested_cascade_opt_len] == '=' )
argv
是一个字符串数组,因此argv[i]
是 i 参数,argv[i][nested_cascade_opt_len]
是索引nested_cascade_opt_len
处的字符。这将检查该字符是否为等号。