0

我问用户他想知道哪个环境变量,然后我用 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);

    }

编译器说:

“不允许在类型“const char*”和“char”之间分配函数参数”

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

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

4

3 回答 3

4

警告是因为这里

value = getenv(input);

你传递一个charto getenv(),它有原型:

   char *getenv(const char *name);

定义input为 char 数组,如:

    char input[256];

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

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

于 2016-05-09T15:46:33.227 回答
2

当你定义char *input;你满足编译器,因为你的语法是有效的:调用时scanf("%s", input);你说你想要一个字符串,它应该放在任何地方input

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

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

于 2016-05-09T15:49:39.417 回答
1

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

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

于 2016-05-09T15:47:01.433 回答