Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3754762
  • 博文数量: 216
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 7480
  • 用 户 组: 普通用户
  • 注册时间: 2013-01-23 18:56
个人简介

将晦涩难懂的技术讲的通俗易懂

文章分类

全部博文(216)

文章存档

2025年(8)

2024年(11)

2023年(9)

2022年(4)

2021年(12)

2020年(8)

2019年(18)

2018年(19)

2017年(9)

2016年(26)

2015年(18)

2014年(54)

2013年(20)

分类: LINUX

2014-05-04 23:35:51

  转载请注明出处:lvyilong316

    我们知道着两个函数都提供每次输入一行的功能。然而gets是一个不推荐使用的函数,其原因是使用gets不能指定缓冲区的长度,这样就可能造成缓冲区的溢出。除了gets只能操作标准输入(stdin)外,gets和fgets还有另一个区别——gets并不将换行符读入缓冲区中。例如:输入”abcde\n”,那么gets时缓冲区中只用”abcde”而没有”\n”。相反fgets则会完整的读入”abcde\n”。

与此对应,puts因为一般和gets成对使用,所以puts输出以NULL结尾的字符串后(NULL不输出),会另外将一个换行符也输出到标准输出。

我们先看下面程序段:

程序段1:

char buf[BUFSIZE]; 

   while( fgets(buf,BUFSIZE,stdin)!=NULL )

  if( fputs(buf,stdout)==EOF )

      printf("output error!\n");

输出:

结论:fgets和fputs结合使用正常工作

分析:输入”abcdef\n”,fgets读入”abcdef\n”到缓冲区,fputs将”abcdef\n”从缓冲区中取出输出。

程序段2:

    char buf[BUFSIZE];

while( gets(buf)!=NULL )

    if( puts(buf)==EOF )

      printf("output error!\n");

输出:

结论:gets和puts结合使用正常工作

分析:输入”abcdef\n”,gets读入”abcdef”到缓冲区(注:不读入’\n’),puts将”abcdef”从缓冲区中取出输出,之后又将一个换行符(‘\n’)输出到标准输出,即gets不读入换行符,而puts增加换行符。

程序段3:

char buf[BUFSIZE];

while( gets(buf)!=NULL )

    if( fputs(buf,stdout)==EOF )

      printf("output error!\n");

输出:

结论:gets和fputs结合使用不能正常工作

分析:输入”abcdef\n”,gets读入”abcdef”到缓冲区(注:不读入’\n’),fputs将”abcdef”从缓冲区中取出输出(并没有增加换行符),所以下一行的输入会和上个输出在同一行,即造成输出比输入少一个换行符。

程序段4:

char buf[BUFSIZE];

while( fgets(buf,BUFSIZE,stdin)!=NULL )

    if( puts(buf)==EOF )

      printf("output error!\n");

输出:

结论:fgets和puts结合不能正常工作

分析:输入”abcdef\n”,fgets读入”abcdef\n”到缓冲区,puts将”abcdef\n”从缓冲区中取出输出(这里已经有一个换行符),之后又将一个换行符输出,所以造成输出比输入多一个换行符(输出两个换行符)。

总结:应该尽量使用fgets和fputs,一方面是比较安全,两一方面保持输入输出的原样性,不必去记忆对换行符的处理。

阅读(3905) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~