搜索
查看: 917|回复: 13
打印 上一主题 下一主题

关于do while的疑惑

[复制链接]
楼主
发表于 2014-3-2 09:38:24 | 显示全部楼层
因为你输入的是: c 回车
第一次读取的是c,第二次读取的是回车

读取之后把缓冲区清掉就可以了
沙发
发表于 2014-3-2 16:47:44 | 显示全部楼层
哎呀呀 发表于 2014-3-2 12:28
是getchar函数的原因吗?
是不是scanf函数也存在这种情况呢?
我把把刚才那个getchar换成了scanf也存在了 ...

getchar一次读一个字符
你输入了两个字符
另一个留在缓冲区内
下一次读取的就是上次输入的回车

fflush(stdin); 只在微软提供的C函数库上有效
这里你不要求严格的除错,那么多写一个getchar就行
  1. printf("输入字母\n");
  2. c=getchar();
  3. getchar();   
  4. printf("%c\n",c);
复制代码


然后就会从缓冲区再读取一个字符,丢弃掉
如果输入没有错误(例如输入一连串的空格再回车的),丢弃掉的就是多余的那个回车
板凳
发表于 2014-3-2 16:55:57 | 显示全部楼层
哎呀呀 发表于 2014-3-2 12:28
是getchar函数的原因吗?
是不是scanf函数也存在这种情况呢?
我把把刚才那个getchar换成了scanf也存在了 ...

scanf非常复杂而且容易出错,近些年的教科书为了省事都直接教用scanf的
其实C最权威的教科书上是在书第七章(一共8章)才提到scanf

这里用scanf大概有两种写法,一种是,大概也就是你出问题的那种
  1. char ch;
  2. scanf("%c", &ch);
复制代码

这里用的占位符是%c,读取一个字符,和getchar一样,会读取缓冲区残留的那个回车

另外一种
  1. char ch[5];
  2. scanf("%4s", ch);
复制代码

这里的占位符是%4s,也就是长度不超过4的字符串。
注意%s占位符会忽略开头的空白字符(空格,回车以及tab制表符),读取到空白字符的时候会结束读取
所以在一个循环连续读取的时候,回车这个占位符就会被忽略,就不再存在这个问题
然后要用字符的时候
  1. if(ch[0] == 'Y')
复制代码
之类的就可以了
地板
发表于 2014-3-2 17:03:12 | 显示全部楼层
哎呀呀 发表于 2014-3-2 12:30
用getchar函数不可以吗?为什么改成这种结果?不懂哟

最后再说一下缓冲区这个名词

用C标准库函数读取键盘输入(getch之类不是标准库函数),是先把输入的内容送入一个缓冲区内,然后当你确认输入(按了回车键)或者缓冲区满了,才会把输入的内容送给程序处理

仔细考虑一下你输入的过程

第一个字符是c,缓冲区没有刷新,程序认为缓冲区是空的,会等待输入
第二个字符是\n(回车),缓冲区刷新,程序发现缓冲区有东西了,开始处理
程序进行处理,看到了一个getchar(),那么从缓冲区读取一个字符

这时候缓冲区有一个字符\n

第二轮循环,程序发现缓冲区有东西,一个\n,然后getchar()读取,进行处理
就是你看到的结果
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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