fgets阅读比它应该更多的char

时间:2016-05-29 17:25:18

标签: c arrays string sizeof fgets

我正在开发一个代码,其中用户将键入多个段落,当用户以“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个字符,我不知道为什么。我已经检查了所有可能检查的内容。

请帮助像我这样的初学者。

3 个答案:

答案 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;