1

有人可以解释以下代码中发生了什么吗?

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] 可以是一个二维数组。任何人都可以启发我了解它的实际含义吗?

4

3 回答 3

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 指向 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 
于 2013-03-31T16:13:16.763 回答
1

对于您的第一个示例,它正在查看 argv 的项目“i”,并询问它是否以包含在cascade_opt. 如果是,则设置cascade_name为余数。cascade_opt因此,例如,如果包含 ,--cascade=并且 argv[i] 包含--cascade=foo', cascade_name would end up pointing tofoo`。

对于您的第二个问题,可以将其argv视为 char*[]。一旦您选择了单个 char*,您就可以使用 [] 来索引字符串中的字符。

于 2013-03-31T16:01:55.387 回答
0
cascade_name = argv[i] + cascade_opt_len;

argv是类型char **。索引它意味着它argv[i]是类型的——即char *一个字符串。将整数添加到 achar *会使指针前进这么多字符。这可能更清楚地写成这样:

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]是 index 处的字符nested_cascade_opt_len。这将检查该字符是否为等号。

于 2013-03-31T16:00:33.523 回答