【发布时间】:2016-05-09 15:41:43
【问题描述】:
我在询问用户他想知道哪个环境变量,然后我用 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)" 错误。
【问题讨论】:
-
char input; ... scanf("%s", input);-->input不够大,无法存储用户文本输入。 (stackoverflow.com/q/37119782/2410359 的类似问题) -
在调用任何
scanf()系列函数时,1) 始终检查返回值(而不是参数值)以确保操作成功。 2) 使用“%s”输入转换说明符时,始终使用“最大长度”修饰符(比输入缓冲区的长度小一),这样用户就不会超出输入缓冲区(这将导致未定义的行为和可能导致段故障事件)。顺便说一句:当输入缓冲区只有 1 个字符长时,您希望如何读取字符串(NUL 终止的字符数组)? -
关于这一行:
printf("%s", value);输出将位于标准输出缓冲区中,直到程序退出,然后(并且只有那时)它才会实际显示在终端上。强烈建议使用:printf("%s\n", value);,因为 '\n'(换行符)会导致标准输出缓冲区立即显示在终端上。
标签: c environment-variables scanf getenv