fgets、gets与fputs、puts

我们知道着两个函数都提供每次输入一行的功能。然而gets是一个不推荐使用的函数,其原因是使用gets不能指定缓冲区的长度,这样就可能造成缓冲区的溢出。除了gets只能操作标准输入(stdin)外,getsfgets还有另一个区别——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");

输出:

结论:fgetsfputs结合使用正常工作

分析:输入abcdef\nfgets读入abcdef\n到缓冲区,fputsabcdef\n从缓冲区中取出输出。

程序段2

    char buf[BUFSIZE];

while( gets(buf)!=NULL )

    if( puts(buf)==EOF )

      printf("output error!\n");

输出:

结论:getsputs结合使用正常工作

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

程序段3

char buf[BUFSIZE];

while( gets(buf)!=NULL )

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

      printf("output error!\n");

输出:

结论:getsfputs结合使用不能正常工作

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

程序段4

char buf[BUFSIZE];

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

    if( puts(buf)==EOF )

      printf("output error!\n");

输出:

结论:fgetsputs结合不能正常工作

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值