首页 > 解决方案 > 当我尝试打印 getenv() 输出时,为什么会出现分段错误?

问题描述

我有一个问题,当我尝试printf输出getenv. 我即将学习如何处理环境函数库。我在代码中看不到任何错误,我感到非常沮丧。

这是我的代码:

extern char **environ;

char c;

int main(int argc, char **argv)
{

    char *input2 = malloc(sizeof(char)*20);
    char *s = malloc(sizeof(char)*20);
    if(input2==NULL||s==NULL)printf("malloc failed");

    printf("---------------------\n"
           "Environment-List Menu\n"
           "---------------------\n\n"
           "[1]: Print environment list\n"
           "[2]: Print environment entry (getenv)\n"
           "[3]: Add environment entry (putenv)\n"
           "[4]: Modify environment entry (setenv)\n"
           "[5]: Remove environment entry (unsetenv)\n"
           "[0]: End\n\n");


    while(1)
    {   
        char a, temp2;
        a=getchar();
        int input = atoi(&a);

        switch(input)
        {
            case 1:
                while(*environ) puts(*environ++);
                break;

            case 2:
                printf("Please enter the entry you're looking for and press enter:\n");
                while((temp2=getchar()!=EOF))
                {
                    printf("beginning loop\n");
                    printf("%s\n",input2);
                    printf("end of loop\n");
                }
                printf("after loop\n");
                s = getenv(input2);
                printf("getenv was called");
                printf("%c\n",*s);
                break;

            case 3:

            case 4:

            case 5:

            case 0:
                return EXIT_SUCCESS;

            default: 
                break;
        }
    }

    return 0;
}

标签: csegmentation-fault

解决方案


以下建议的代码:

  1. 干净地编译
  2. 执行所需的操作
  3. 正确检查错误

现在,建议的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


#define MAX_LINE 1024

extern char **environ;


int main( void )
{
    int done = 0;
    while( !done )
    {
        char **envList = environ;


        printf("---------------------\n"
               "Environment-List Menu\n"
               "---------------------\n\n"
               "[1]: Print environment list\n"
               "[2]: Print environment entry (getenv)\n"
               "[3]: Add environment entry (putenv)\n"
               "[4]: Modify environment entry (setenv)\n"
               "[5]: Remove environment entry (unsetenv)\n"
               "[0]: End\n\n");

        int choice = getchar();
        int ch;
        while( (ch = getchar()) && ch != '\n' );

        switch( choice )
        {
            case '1':

                while(*envList)
                {
                    puts(*envList);
                    envList++;
                }

                break;

            case '2':
                printf("Please enter the entry you're looking for and press enter:\n");
                char line[ MAX_LINE ];

                if( !fgets( line, sizeof( line ), stdin ) )
                {
                    perror( "fgets failed" );
                }

                else
                {
                    line[ strcspn( line, "\n" ) ] = '\0';
                    if( strlen( line ) == 0 )
                    {
                        break;
                    }

                    //puts( line );
                    char *temp = getenv( line );
                    if( !temp )
                    {
                        printf( "%s not found\n", line );
                    }

                    else
                    {
                        puts( temp );
                    }
                }
                break;

            case '3':
            case '4':
            case '5':
                puts( "that option not yet implemented" );
                break;

            case '0':
                done = 1;
                break;

            default:
                puts( "invalid menu option, try again" );
                break;
        }  // end switch
    }

    return 0;
}

推荐阅读