1

誰かが次のコードで何が起こっているのか説明できますか?

if( strncmp( argv[i], cascade_opt, cascade_opt_len) == 0 )
                cascade_name = argv[i] + cascade_opt_len;

私の推測では、この 2 行は、ユーザーによってキー入力されたカスケードの種類 (したがって argv[i]) をチェックし、最初の cascade_opt_len 文字が同じ場合は、argv[i] と cascade_opt_len を連結します。しかし、なぜ名前を整数と連結するのでしょうか?

また、

if( argv[i][nested_cascade_opt_len] == '=' )

argv[i] は、ユーザーが入力したキーを記録する 1 次元配列であると常に考えていました。それが実際に何を意味するのかを教えてくれる人はいますか?

4

3 に答える 3

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 が 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印刷されないのか分かりますか?

編集

== '='の3番目のコードは役に立ちます:出力を理解してみてください:

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 に答える