C-scanf()然后是getenv()

C-scanf()然后是getenv(),c,environment-variables,scanf,getenv,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 y

我问用户想知道哪个环境变量,然后用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 ist类型之间分配函数参数

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


现在没有编译器错误,但是当我提交一个名称(例如USER)时,我得到了一个分段错误。核心转储错误。

警告是因为

value = getenv(input);
将一个字符传递给,该字符具有以下原型:

   char *getenv(const char *name);
将输入定义为字符数组,如:

    char input[256];

    printf("Which variable do you want?\n");
    scanf("%255s", input); //specify the width to avoid buffer overflow
或者,如果您认为256不够大,您可以使用malloc动态分配内存。

字符是单个字符。 char*input声明一个变量,该变量包含指向字符的指针,但没有用于存储数据的内存。在C语言中,这是正确的行为。但是,sSCANF期望您实际传递指向分配内存的指针,请考虑该函数不返回任何指针,因此它不可能为您分配内存。 所以在声明和使用之间,请使用malloc来分配内存。

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

问题是输入尚未初始化。。。它所指的位置目前未定义;在使用任何指针之前,你必须使它指向某个有效且足够大的地方,以容纳你想放在那里的任何东西

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

char input。。。扫描%s,输入;->输入不够大,无法存储用户文本输入。调用任何scanf系列函数时,1都会检查返回值而不是参数值,以确保操作成功。2使用“%s”输入转换说明符时,请始终使用比输入缓冲区长度小一的“max length”修饰符,这样用户就不会溢出输入缓冲区,从而导致未定义的行为并可能导致seg故障事件。顺便说一句:当输入缓冲区只有1个字符长时,您希望如何读取以字符串NUL结尾的字符数组?关于此行:printf%s,value;输出将保存在标准输出缓冲区中,直到程序退出,然后,也只有到那时,它才会真正显示在终端上。强烈建议使用:printf%s\n,value;因为“\n”换行符将导致标准输出缓冲区立即显示在终端上。