我是 C 的初学者;我这样做主要是为了测试使用 fgets() 并停止使用 scanf(),但是当我在处理这段代码时,发生了一些奇怪的事情。我编译并运行了这个程序:
int main() {
int i;
char c;
printf("Input an integer: ");
scanf("%i", &i);
printf("Number received: %i\n", i);
getchar(); // clear '\n' from input
printf("Input a character: ");
//scanf("%c", &c);
fgets(&c, 2, stdin);
printf("Integer: <%i>\n", i);
printf("Char: <%c>\n", c);
return 0;
}
输入:
12
r
输出:
Input an integer: 12
Number received: 12
Input a character: r
Integer: <0>
Char: <r>
所以,我很好奇为什么将“i”设置为 0。注释 fgets() 和取消注释 scanf() 会使程序按预期工作。提前致谢。
最佳答案
线
fgets(&c, 2, stdin);
声明 &c
是指向 char
数组中的 char
的指针,至少有一个有效的 char
紧跟在 c
之后。它不是,所以你的程序有未定义的行为。
(所以任何事情都有可能发生,但看起来你的情况实际发生的是读取溢出了 c
变量并且还修改了 i
变量的一个字节,这恰好在内存中是相邻的。)
关于C: 由于某种原因使用 fgets() 接收一个字符似乎将一个不相关的整数变量设置为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46880219/