使用fgets()将字符放入数组会创建自动输入吗?

时间:2017-02-07 05:04:22

标签: c arrays fgets

我想接受用户输入的单个输入字符,然后使用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()语句,然后在下面打印出一个空行,然后程序终止。

为什么这个世界?为什么代码以这种方式响应而不是我的期望?

2 个答案:

答案 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会导致它等待输入。