1

現在、シェルをコーディングしていますが、何らかの理由で printenv 関数を動作させることができません。コマンドが与えられていないときは動作します。2 つの引数が与えられた場合も機能します。ただし、1 つの引数が指定された場合は機能せず、何も出力されません。

コードは次のとおりです。

else if (strcmp(args[0], "printenv")==0){
        /* Previously: if (args[1] == NULL && args[0] != NULL){ */
        if (argc == 1){
            int i = 0;
            while (envp[i] != NULL){
                printf("%s\n", envp[i++]);
            }
        }
        /* Previously: else if (args[2] == NULL && args[1] != NULL){ */
        else if (argc == 2){
            char *env;
            while (args[1] = *argv++){
                env = getenv(args[1]);
                if (env != NULL){
                    printf("%s", env);              
                }           
            }
            free(env);
        }
        else {
            fprintf(stderr, "%s: Too many arguments\n", args[0]);
        }   

    }
4

1 に答える 1

2
else if (strcmp(args[0], "printenv")==0){
        if (args[1] == NULL && args[0] != NULL){

ここで読むのをやめました。strcmp呼び出しはすでにそれを決定している*args[0]=='p'のに、なぜargs[0]NULL と比較しているのですか?


さて、それは片付けられました。このループはまったく必要ないと思います:

        while (args[1] = *argv++){
            env = getenv(args[1]);
            if (env != NULL){
                printf("%s", env);              
            }           
        }

ループ本体のみ:

            env = getenv(args[1]);
            if (env != NULL){
                printf("%s", env);              
            }

また、@Jason のコメントのように、返されたポインタ (またはそれが指すgetenvデータ) を解放 (または変更) しないでください。

于 2012-10-01T04:19:47.317 に答える