查询面部检测代码

时间:2013-03-31 15:55:28

标签: c

有人可以解释以下代码中发生的事情吗?

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数组。有人能够启发我的实际意义吗?

3 个答案:

答案 0 :(得分:2)

if( strncmp( argv[i], cascade_opt, cascade_opt_len) == 0 )
        ^              ^             ^ 

这可能会检查argv [i]常量第一个子串等于cascade_optcascade_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处的字符。这将检查该字符是否为等号。