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);
你传一个char
给getenv()
,它的原型是:
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];
。请注意,这是有问题的,因为如果输入超过您的缓冲区,您将覆盖其他内存...但这应该让您现在继续前进。
我问用户他想知道哪个环境变量,然后我用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);
你传一个char
给getenv()
,它的原型是:
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];
。请注意,这是有问题的,因为如果输入超过您的缓冲区,您将覆盖其他内存...但这应该让您现在继续前进。