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