我正在开发一个代码,其中用户将键入多个段落,当用户以“END”开始段落时,它将停止读取。代码将通过计算每个字母并显示图表来操纵字符串,等等等等,但这与问题无关。 问题是:哪个段落的长度不得超过1000个字符。
代码的较小版本如下(考虑到我只想存储5-char-string - 即使我将扩展它)。
#include <stdio.h>
#include <string.h>
int main()
{
char paragraph[5];
for ( ; ; )
{
fgets(paragraph, 5, stdin);
if (paragraph[0]=='E' && paragraph[1]=='N' && paragraph[2]=='D')
{ return 0; }
printf("%s", paragraph);
}
return 0;
我的问题是:如果我输入超过5个字符,printf函数仍会打印超过5个字符,我不知道为什么。我已经检查了所有可能检查的内容。
请帮助像我这样的初学者。
答案 0 :(得分:1)
fgets()从流和中读取最多一个小于大小的字符 将它们存储到s指向的缓冲区中。读后停止了 EOF或换行符。如果读取换行符,则将其存储到缓冲区中。 终止空字节('\ 0')存储在最后一个字符之后 缓冲区。
因此,当输入超过 4 个字符(包括换行符)时,只读取4个,其余字符留在缓冲区中,准备好在下一个fgets
读取。
在这种情况下,您的printf
不会打印任何换行符,并会多次调用,使其看起来像打印超过4个字符。
根据评论中的建议,请尝试printf("[%s]", paragraph);
查看各个printf
来电。
答案 1 :(得分:0)
尝试按以下方式修改代码,当您输入的字符多于缓冲区的fgets()
时,立即 查看size
函数实际发生的情况。它不是从键盘读取,而是从stdin
缓冲区读取。这些SO帖子也可能对您有用:(1),(2)。享受演示并确保彻底阅读man
页。
#include <stdio.h>
int main()
{
char paragraph[5];
for ( ; ; )
{
printf("Enter the string: \n\t");
if(fgets(paragraph, 5, stdin) != NULL)
printf("%s\n", paragraph);
if (paragraph[0]=='E' && paragraph[1]=='N' && paragraph[2]=='D')
return 0;
}
return 0;
}
答案 2 :(得分:0)
你应该在string.h中使用strstr,因为它更干净。
if (strstr(paragraph, "END"))
return 0;
而不是
if (paragraph[0]=='E' && paragraph[1]=='N' && paragraph[2]=='D')
return 0;