1

我目前正在编写一个 shell,由于某种原因,我无法让我的 printenv 函数工作。当没有给出命令时,它会起作用。当给出两个参数时,它也有效。但是,当给出一个参数时,它不起作用并且什么也不打印。

代码如下:

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 回答