我想接受用户输入的单个输入字符,然后使用printf()和fgets()方法将其打印出来(这是一个更大的程序的一部分,但这是孤立的问题)。
include <stdio.h>
include <stdlib.h>
char input[1];
int main(){
printf("Please enter the minimum value the random number can be: ");
fgets(input, sizeof(input), stdin);
printf("\n%c", input[0]);
}
我认为它会打印出printf()消息,然后等待用户的输入。无论他们输入什么内容,我都会期望它输入该输入的第一个字符并再将其打印一行。
程序打印出初始的printf()语句,然后在下面打印出一个空行,然后程序终止。
为什么这个世界?为什么代码以这种方式响应而不是我的期望?
答案 0 :(得分:3)
从C11
开始,第7.21.7.2章,fgets()
概要和说明,(强调我的)
char *fgets(char * restrict s, int n, FILE * restrict stream);
fgets
函数读取的最多比n
指定的字符数少一个 从流指向的流到s
指向的数组。 [...]
并且关于少一个背后的原因,
[...] A 在读入数组的最后一个字符后立即写入空字符。
在您的情况下,n
提供的值为1
,因此fgets()
实际上没有读取任何内容!!
解决方案:您需要更改数组大小2,输入一个元素和终止null的一个元素。
答案 1 :(得分:1)
您需要空间来存储NUL终结符,因此提供大小为1的缓冲区意味着无法输入数据。
fgets
可能正在检测到这一点并且刚刚退出。将数组大小更改为2
会导致它等待输入。