搜索
查看: 1513|回复: 8
打印 上一主题 下一主题

[原创] 有效的解决了从缓冲区读取指定字节的字符串

[复制链接]
跳转到指定楼层
楼主
发表于 2013-10-11 01:27:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 rosynirvana 于 2014-9-1 13:09 编辑
  1. /*
  2.         @忘记 论坛ID:gaoyukonga
  3.         这段代码讲解了如何正确的读入范围内的字符串
  4.         并且直接有效的干掉了我所知道的错误
  5.         错误 如:
  6.                      缓冲区遗留
  7.                      数组越界等问题
  8.         综合进行了下处理 这样有效的处理了在做 登陆 的时候的输入问题
  9.         请详细看!
  10.                                                                                                                */

  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include <string.h>
  14. int main()
  15. {
  16.     //我们本次就只读入10个长度的字符串来实例
  17.     //可能要问我为什么要写12的下标 稍后讲解这个
  18.     char buf[12] = { };
  19.     printf("请输入字符串:\n");
  20.     //fgets是一个相对安全的函数 他只会从缓冲区读取你指定字节的字符串
  21.     fgets(buf, sizeof(buf), stdin);
  22.     //现在开始对字符串读入是否成功进行判断
  23.     /*
  24.       因为fgets 会把'\n' 也一并读入
  25.       并且字符串结尾是'\0'
  26.       所以毫无疑问如果我们10个长度那么
  27.       buf里面肯定包括 '\n' 和 '\0'
  28.       如果输入的长度超过10后 那么'\n'肯定是读不进来的
  29.       所以这里我们只需要去找'\n'
  30.                                                                                                         */
  31.     int i,res = 0;
  32.     for(i = 0; i<= 11; i++) {
  33.                 if(buf[i] == '\n') {
  34.                         res = 1;
  35.                         break;
  36.         }
  37.     }
  38.     if(res == 1) printf("输入正确\n%s",buf);
  39.     else printf("输入出错!字符串长度不在范围内\n");
  40.         //好了 这样就干掉了输入越界的问题了                        
  41.     system("pause");
  42.     return 0;
  43. }
  44.     //当然 如果你要做为循环的话 因为读入的字节还有遗留在缓冲区的记得清空
  45.     //可以用
  46.     //fflush(stdin);
  47.     //scanf("%*[^\n]"); scanf("%*c");
  48.     //进行清空!!!
  49.     //记得给分哦!!![i]
复制代码
沙发
 楼主| 发表于 2013-10-11 01:39:23 | 只看该作者
之前的还有点问题 现在已经修正了! 不好意思 工作了一天 确实有点头晕了!
板凳
发表于 2013-10-11 01:59:09 | 只看该作者
还是不正确,你忘了EOF结束读取的情况

还有一处语义错误
if(buf == '\n') {

此外fflush(stdin)是不可移植的,只有微软的msvcrt支持

地板
发表于 2013-10-11 15:49:32 | 只看该作者
LZ注释写那么多!无语!
5#
 楼主| 发表于 2013-10-12 01:49:26 | 只看该作者
rosynirvana 发表于 2013-10-11 01:59
还是不正确,你忘了EOF结束读取的情况

还有一处语义错误

谢谢 提醒  那个buf 的下标跑最后去了 没注意是怎么的 不好意思啊 呵呵
6#
 楼主| 发表于 2013-10-12 01:49:50 | 只看该作者
超神级 发表于 2013-10-11 15:49
LZ注释写那么多!无语!

还是为了大家能搞懂啦!
7#
 楼主| 发表于 2013-10-12 01:57:10 | 只看该作者
rosynirvana 发表于 2013-10-11 01:59
还是不正确,你忘了EOF结束读取的情况

还有一处语义错误

上面的代码 修改好了 语义错误后 然后测试了没问题啊 EOF那个似乎不需要去管它吧 我只是找结尾\n啊
8#
发表于 2013-10-12 02:07:23 | 只看该作者
gaoyukonga 发表于 2013-10-12 01:57
上面的代码 修改好了 语义错误后 然后测试了没问题啊 EOF那个似乎不需要去管它吧 我只是找结尾\n啊

EOF为什么不要管?
为什么能信任用户不会用EOF结束输入?

点评

恩 知道了 会做修改的 谢谢!  发表于 2013-10-12 18:27
9#
发表于 2013-10-12 10:17:59 | 只看该作者
gaoyukonga 发表于 2013-10-12 01:49
还是为了大家能搞懂啦!

嗯。。                              
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表