了解fgets()函数

时间:2014-10-19 04:11:05

标签: c string fgets

我尝试编写一个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个字符的字符串时,编译器不会告诉任何内容并继续打印所有字符串。

2 个答案:

答案 0 :(得分:3)

  

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

对于一个,&#34;未定义的行为&#34;并不意味着崩溃。这意味着标准并不保证你任何东西。现在,无论是明显的还是壮观的(即导致崩溃或其他事情),仅仅是运气问题。

  

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

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

但是,您传递缓冲区大小fgets()(作为其第二个参数)。 坦率地说,为什么你认为那个参数存在?它正是出于这个目的。 fgets()不会读取比允许更多的字符(一次)。如果这是缓冲区大小(通常应该是这样),那么您将始终是安全的。

但是,如果您努力阅读fgets()的文档,我相信您可以自己推断出来。

答案 1 :(得分:2)

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

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

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

现在进入一条短线;你会看到它是双倍间距打印的(带有一个额外的换行符)。

现在去进入一条长线。您将看到打印的前9个字符,然后是第9个字符,依此类推,直到该行的最后几个字符被双倍打印。

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