我正在编写一个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]);
        }

    }

最佳答案

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返回的指针(或者它指向的数据)。

关于c - 在C中打印环境,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12666995/

10-11 16:44