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
指向 argv[1] 中的最后一个子字符串“Grijesh”之后。
好的,我使用循环扩展此代码以解析每个输入命令行参数:
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