C - scanf() 然后是 getenv()

C - scanf() and then getenv()

我问用户他想知道哪个环境变量,然后我用scanf扫描它。但这对我不起作用。这是我的代码:

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


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

        char *value;
        char input;

        printf("Which variable do you want?\n");
        scanf("%s", input);

        value = getenv(input);

        printf("%s", value);

    }

编译器说:

"Function argument assignment between types "const char*" and "char" ist not allowed"

所以我尝试将输入变量更改为:char const *input

现在没有编译器错误,但是当我提交一个名称时,例如 "USER",我得到一个 "Segmentation fault (core dumped)" 错误。

警告是因为这里

value = getenv(input);

你传一个chargetenv(),它的原型是:

   char *getenv(const char *name);

input 定义为字符数组,例如:

    char input[256];

    printf("Which variable do you want?\n");
    scanf("%255s", input); //specify the width to avoid buffer overflow

或者,如果您认为 256 不够大,您可以使用动态内存分配(使用 malloc)。

char 是单个 char.
char *input 声明了一个变量,该变量包含一个指向字符的指针,但没有用于数据的内存。在 C 中,这是正确的行为。但是,sscanf 期望您实际上传递了一个指向已分配内存的指针(请考虑该函数没有 return 任何指针,因此它没有机会为您分配内存)。

所以在声明和使用之间,请使用malloc分配内存。

当您定义 char *input; 时,您满足了编译器的要求,因为您的语法是有效的:当调用 scanf("%s", input); 时,您是在说您想要一个字符串,它应该放在 input 所在的位置。

问题是 input 还没有在任何地方(初始化)...它指向的地方目前还未定义;在使用任何指针之前,你必须让它指向一个有效的地方(并且足够大以容纳你打算放在那里的任何东西)。

有几种方法可以解决这个问题,但也许最简单的方法是确定输入需要多大并声明一个字符数组,例如:char input[512];。请注意,这是有问题的,因为如果输入超过您的缓冲区,您将覆盖其他内存...但这应该让您现在继续前进。