【问题标题】:Understanding fgets() function理解 fgets() 函数
【发布时间】:2014-10-19 04:11:04
【问题描述】:

我尝试编写一个c程序来提示用户使用fgets()函数输入一个字符串。

这是代码:

#include <stdio.h>

#define MAXLEN 10

int main (void){
   char buffer[MAXLEN]; 
   puts("Enter text a line at a time;enter a blank to exit.");

   while(fgets(buffer,MAXLEN,stdin) != NULL){
      printf("%s",buffer);
      if(buffer[0]=='\n')
        break;
   }
   return 0;
}

我的问题是为什么程序仍然运行并且不会导致任何未定义的行为?自从 MAXLEN=10,当我输入一个长度超过 10 个字符的字符串时,编译器什么也不说,继续打印所有字符串。

【问题讨论】:

  • 编译器在运行时从不告诉任何东西。
  • fgets() 将拨打 9char 并将其余的留在 stdin 以供下次通话。
  • @barakmanos 我的意思是在运行时,我已经编辑了我的问题@chux 我已经第二次调用 `fgets()' 并且程序仍然运行正确并且没有迹象表明剩余的字符串留在标准输入缓冲区。

标签: c string fgets


【解决方案1】:

并且不会导致任何未定义的行为?

首先,“未定义的行为”并不意味着崩溃。这意味着标准不向您保证任何事情。现在,这是否是明显的或壮观的(即导致崩溃或其他什么),只是一个运气问题。

我输入了一个长度超过 10 个字符的字符串,编译器不告诉任何内容并继续打印所有字符串。

编译器不会打印字符串,你的程序会。编译器也不知道用户将输入的字符串的长度。

但是,您传递fgets() 缓冲区的大小(作为其第二个参数)。 坦率地说,您为什么认为该参数存在?它正是为此目的而存在的。 fgets() 不会(一次)读取超过允许的字符数。如果这是缓冲区大小(通常应该是),那么您将永远是安全的。

但我敢肯定,如果您努力阅读 fgets() 的文档,您自己就可以推断出这一点。

【讨论】:

    【解决方案2】:

    通过在打印中添加换行符来修改您的代码:

    printf("%s\n", buffer);
    

    这将让您更准确地了解 fgets() 的行为方式(并且它的行为非常好,因为它应该表现得很好)。

    现在去输入一条短线;您会看到它以双倍行距打印(带有额外的换行符)。

    现在去输入一个长队。您将看到打印的前 9 个字符,然后是第二个 9,依此类推,直到行中的最后几个字符以双倍行距打印。

    请注意,如果您输入的行是 9 个字符的倍数加上换行符,则循环将终止,因为 fgets() 最终将只返回换行符,您的代码会将其视为空行。

    【讨论】:

      猜你喜欢
      • 2021-12-29
      • 1970-01-01
      • 2017-08-11
      • 2019-04-12
      • 2013-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多