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

C 使用fgets()将字符放入数组会创建自动输入吗?,c,arrays,fgets,C,Arrays,Fgets,我想接收用户输入的单个字符,然后使用printf()和fgets()方法将其打印出来(这是一个更大的程序的一部分,但这是一个孤立的问题) 包括 包括 字符输入[1]; int main(){ printf(“请输入随机数的最小值:”); fgets(输入,sizeof(输入),标准输入); printf(“\n%c”,输入[0]); } 我期望上面的代码如何工作 我认为它会打印出printf()消息,然后等待用户的输入。不管他们输入了什么,我都希望它能把输入的第一个字符再打印出来 上述代码实际

我想接收用户输入的单个字符,然后使用printf()和fgets()方法将其打印出来(这是一个更大的程序的一部分,但这是一个孤立的问题)

包括
包括
字符输入[1];
int main(){
printf(“请输入随机数的最小值:”);
fgets(输入,sizeof(输入),标准输入);
printf(“\n%c”,输入[0]);
}
我期望上面的代码如何工作 我认为它会打印出printf()消息,然后等待用户的输入。不管他们输入了什么,我都希望它能把输入的第一个字符再打印出来

上述代码实际上是如何工作的 程序打印初始printf()语句,然后在下面打印一个空行,然后程序终止


这到底是为什么??为什么代码会以这种方式响应,而不是我期望的方式响应?

您需要空间来存储NUL终止符,因此提供大小为1的缓冲区意味着不可能输入数据


很可能是
fgets
检测到了这一点,然后退出。将数组大小更改为
2
会导致它等待输入。

您需要空间来存储NUL终止符,因此提供大小为1的缓冲区意味着无法输入数据


很可能是
fgets
检测到了这一点,然后退出。将数组大小更改为
2
会导致它等待输入。

来自
C11
,第7.21.7.2章,
fgets()
概要和说明,(重点)

fgets
函数读取的字符数最多比
n
指定的字符数少一个 从stream指向的流到
s
指向的数组。[……]

至于少一个的原因,

[…]A 在最后一个字符读入数组后立即写入空字符

在您的情况下,提供的
n
的值是
1
,因此
fgets()
实际上不读取任何内容


解决方案:您需要更改数组大小两个2,一个元素用于输入,一个元素用于终止空值。

来自
C11
,第7.21.7.2章,
fgets()
概要和说明,(重点是我的)

fgets
函数读取的字符数最多比
n
指定的字符数少一个 从stream指向的流到
s
指向的数组。[……]

至于少一个的原因,

[…]A 在最后一个字符读入数组后立即写入空字符

在您的情况下,提供的
n
的值是
1
,因此
fgets()
实际上不读取任何内容


解决方案:您需要更改数组大小两个2,一个元素用于输入,一个元素用于终止null。

读取。
fgets(缓冲区、大小、文件)
最多读取
size-1
字节。这就是为什么C/C++中的.string以null结尾,因此
fgets
希望为字符串和终止的零字符都提供空间。1个字符只够适合零字符。请不要混淆两种语言,尤其是当问题本身是C特定的-C++字符串时,它不是C++字符串的任何一种。@ PAXDIABOL+C++有多种字符串(包括C字符串),但是,YUP,混淆是不必要的。请阅读.<代码> FFET(缓冲区,大小,文件)最多读取
size-1
字节。这就是为什么C/C++中的.string以null结尾,因此
fgets
希望为字符串和终止的零字符都提供空间。1个字符只够适合零字符。请不要混淆两种语言,尤其是当问题本身是C++特定的C++字符串时,它不是C字符串。我正在阅读的文档没有提到这个警告。把它改成2解决了我的问题!(我会在计时器允许的时候接受这个答案)啊,这就解释了!我正在阅读的文档没有提到这个警告。把它改成2解决了我的问题!(计时器允许时,我将接受此答案)
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]);
}
char *fgets(char * restrict s, int n, FILE * restrict stream);