关于fgets()函数使用时遇到的问题和解决办法

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include "struct.h"

//这是一个录入书的名称和价格的程序main函数
  7 int main()
  8 {
  9     STRBOOK book;
 10     int tmp = 0;
 11     printf("Input a book name\n");
 12     tmp = name(&book);//调用子函数录入名称
 13     printf("Input a book price\n");
 14     price(&book, tmp);//调用子函数录入价格,这里为什么有两个参数,后面会写
 15     print(&book);
 16     return 0;
 17 }   

        问题描述:fgets函数的原型为char *fgets(char *buf, int bufsize, FILE *stream);,可以录入bufsize-1个字符。(1)如果键盘输入的字符个数少于bufsize-1个,函数会将回车录走,输出是将回车打印出来;(2)如果键盘输入的字符大于bufsize-1个,函数录走bufsize-1个字符后,剩下的字符留在数据缓冲区,下次调用price()函数时,该函数直接读取缓冲区内容,不会等键盘输入而跳过输入,导致输入失败。

        处理(1)时想到的办法是判读输入字符串最后一位字符是否是‘\n’,若是的话,将这位变成'\0',这样就不会输出回车。

        下面是子函数代码:

  6  name(STRBOOK * book)
  7 {
  8     char str[NAME] = {0};
  9     fgets(str, NAME, stdin);
 10     if( str[ strlen(str) - 1 ] == '\n' )
 11     {   
 12         str[ strlen(str) - 1] = '\0';
 13         strncpy(book -> name, str, NAME - 1);
 14
 15     }   
 16     strncpy(book -> name, str, NAME - 1);
 17
 18 }   

        这样确实解决了(1),在下一步调用price()函数时输入数字没有问题,那么接下来解决(2),利用清空数据缓冲区的代码:

while('\n' != getchar());

        测试输入超过bufsize-1个字符,后面price()可以正常输入,没有问题,但是输入不超过bufsize-1个字符时,出现了调用price()函数时需要输入一次回车才能输入价格。分析原因是:输入字符个数较少时,name()函数吃掉了回车符,故到了price函数,遇到了清空缓冲区的代码,只有输入的字符中由’\n‘才能通过,进行下一步。这就比较纠结了,去掉清空缓冲区的代码吧,不行,不去吧,每次输入价格都得由回车,很不爽。思来想去只想到一个办法,就是让name()函数返回一个值,目的是提示输入的字符到底是多还是少,这就有了开口price()函数由两个参数。

        price()函数代码如下:

 20 void price(STRBOOK * book, int tmp)
 21 {
 22     if(tmp == 0)
 23     while('\n' != getchar());
 24     scanf("%f", &book -> price);
 25 }

         修改后的name()函数如下:

  6 int name(STRBOOK * book)
  7 {
  8     char str[NAME] = {0};
  9     fgets(str, NAME, stdin);
 10     if( str[ strlen(str) - 1 ] == '\n' )
 11     {   
 12         str[ strlen(str) - 1] = '\0';
 13         strncpy(book -> name, str, NAME - 1);
 14         return 1;
 15     }   
 16     strncpy(book -> name, str, NAME - 1);
 17     return 0;
 18 }   
        这样两个问题就完美解决了。返回值虽然可以解决,但是觉得有点麻烦,不过到目前没有想出更好的办法。。。。





  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值