关于fgets()函数使用时遇到的问题和解决办法
来源:互联网 发布:用网络怎么发短信 编辑:程序博客网 时间:2024/05/16 10:28
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 }这样两个问题就完美解决了。返回值虽然可以解决,但是觉得有点麻烦,不过到目前没有想出更好的办法。。。。
- 关于fgets()函数使用时遇到的问题和解决办法
- 做毕业设计遇到的关于fgets()函数的问题
- 关于FGETS()函数的使用
- 关于fgets()函数的一个简单问题
- fgets函数使用时应该注意的问题
- fgets函数的使用
- fgets函数的使用
- 关于Emgu安装和使用中遇到的问题和解决办法
- 关于gets函数和fgets函数的一些理解
- 关于AlphaBlend函数使用时遇到的问题
- 关于BadgeView遇到的一个奇怪的问题和解决办法
- 关于随机数 遇到的一些问题和解决办法
- 关于初学struts2遇到的问题和解决办法
- 关于UISearchDisplayController和 uisearchBar使用时遇到的问题
- gitHub 的使用过程中遇到的问题和解决办法
- 使用scanf和fgets需要注意的一个小问题
- VC6中使用for_each和mem_fun遇到问题的解决办法
- 今天学习使用mysql遇到的问题和解决办法
- tomcat警告setting property 'debug' to '0' did not find a matching property
- 令牌环网Token Ring协议
- Android Studio导入从Github下载的源码
- [主席树] BZOJ 4771 七彩树
- 动态改变IFRAME的指向和高度
- 关于fgets()函数使用时遇到的问题和解决办法
- java入门 数组
- (转)Android更新UI的两种方法——Handler与runOnUiThread()
- 蓝桥杯PREV-32——历届试题 分糖果
- C++ 顺序容器的一些操作
- Java学习提要——'Thread类'与'Runnable接口'基础
- Oracle 11g导出缺失表
- SVM多类分类方法
- 浅析C#数据类型转换的几种形式