C - scanf()然后getenv()

时间:2016-05-09 15:41:43

标签: c environment-variables scanf 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);

    }

编译器说:

  

&#34;类型之间的函数参数赋值&#34; const char *&#34;和&#34; char&#34;不允许&#34;

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

现在没有编译器错误,但是当我提交名称时,例如&#34; USER&#34;,我收到"Segmentation fault (core dumped)"错误。

3 个答案:

答案 0 :(得分:4)

警告是因为这里

value = getenv(input);

您将char传递给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)。

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

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

因此,在声明和使用之间,请使用malloc来分配内存。