我问用户他想知道哪个环境变量,然后我用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)"
错误。
答案 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
来分配内存。