鱼C论坛

 找回密码
 立即注册
查看: 8510|回复: 18

求解while(getchar()!='\n')continue;问题

[复制链接]
发表于 2012-8-30 18:33:42 | 显示全部楼层 |阅读模式
50鱼币
本帖最后由 猪八哥 于 2012-8-31 22:19 编辑
  1. #include<stdio.h>
  2. #include<ctype.h>
  3. int main(void)
  4. {
  5. char get(void);
  6. int ch;

  7. while((ch=get())!=EOF)
  8. putchar(ch);
  9. return 0;
  10. }
  11. char get(void)
  12. {
  13. int ch;
  14. ch=getchar();
  15. while(getchar()!='\n')
  16. continue;
  17. return ch;
  18. }
复制代码

本意是输入字符窜,返回头一个字符,一直到输出EOF文件结束符,假如1:我一开始就输入ctrl+z就是结束符的时候,然后按回车,应该是结束编译才对,但是 还要再按一次回车才能结束:2:还有一问题是加入我输入abc^z,然后回车,应该输出a才对,没想到同样 还是要再按一次回车才显示a。。。请指导的详细说一下。
ch=getchar();
while(getchar()!='\n')
continue;
这段程序什么意思?我的理解是输入字符窜。然后把第一个字符赋值给CH。剩下的丢弃。

最佳答案

查看完整内容

楼主可以用这个程序试一下 一旦getchar接收到EOF,整个流就被清空,\n也就接受不到了,所以需要再按一下回车才能使getchar=='\n'即结束程序,而且,如果EOF在开头,则能接受到,若EOF在行中或行尾则接受不到,所以对于abc^z我现在也没有办法 对于开头的EOF,可以改成
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-8-30 18:33:43 | 显示全部楼层
本帖最后由 the_one 于 2012-8-30 21:56 编辑

楼主可以用这个程序试一下
  1. #include<stdio.h>

  2. int main(void)
  3. {
  4. char ch;
  5. while ( (ch=getchar()))
  6. {
  7.   printf("ok\n");
  8.   continue;
  9. }
  10. return 0;
  11. }
复制代码
一旦getchar接收到EOF,整个流就被清空,\n也就接受不到了,所以需要再按一下回车才能使getchar=='\n'即结束程序,而且,如果EOF在开头,则能接受到,若EOF在行中或行尾则接受不到,所以对于abc^z我现在也没有办法
对于开头的EOF,可以改成
  1. #include<stdio.h>
  2. #include<ctype.h>

  3. int main(void)
  4. {
  5. char get(void);
  6. int ch;
  7. while((ch=get())!=EOF)
  8.   putchar(ch);
  9. return 0;
  10. }char get(void)
  11. {
  12. int ch,c;
  13. ch=getchar();
  14. if (EOF == ch)//加上这里,如果有EOF直接退出
  15.   return ch;
  16. while(getchar()!='\n')
  17.   continue;
  18. return ch;
  19. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-8-30 19:17:31 | 显示全部楼层
16.while(getchar()!='\n')
while(ch!='\n')
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-8-30 19:59:38 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-8-30 20:01:25 | 显示全部楼层
往事如烟 发表于 2012-8-30 19:17
16.while(getchar()!='\n')
while(ch!='\n')

还有就是 按照你的写法 输入ctrl+z 还是不对 还要按俩次回车 才行
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-8-30 20:03:34 | 显示全部楼层
楼上说while(getchar()!='\n'),改为while(ch!='\n'),我猜可能是条件出错引起!!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-8-30 20:06:23 | 显示全部楼层
绝影&瞬风 发表于 2012-8-30 20:03
楼上说while(getchar()!='\n'),改为while(ch!='\n'),我猜可能是条件出错引起!!

不对哦、、。、。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-8-30 21:11:21 | 显示全部楼层
  1. #include<stdio.h>
  2. int main(void)
  3. {
  4.       char ch;
  5.       ch=getchar();
  6.       if(getchar() != EOF)
  7.       {
  8.             putchar(ch);
  9.       }
  10.       return 0;
  11. }
复制代码
不会搞的像你那么复杂,来个简单的。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-8-30 21:36:23 | 显示全部楼层
提问者对流和缓冲的概念不是很理解哦,建议看看这方面的知识,再来看看这个问题。
单独解决这个问题没有实际意义!!!

评分

参与人数 1鱼币 +1 贡献 +1 收起 理由
猪八哥 + 1 + 1

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-8-31 10:16:08 | 显示全部楼层
大头石 发表于 2012-8-30 21:36
提问者对流和缓冲的概念不是很理解哦,建议看看这方面的知识,再来看看这个问题。
单独解决这个问题没有实 ...

谢谢 确实如此。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-8-31 18:02:02 | 显示全部楼层
因为你定义的函数里有两个getchar函数,getchar函数要遇到回车才会开始读取字符:lol
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-8-31 22:19:25 | 显示全部楼层
ch=getchar();
while(getchar()!='\n')
continue;
这段程序什么意思?我的理解是输入字符窜。然后把第一个字符赋值给CH。剩下的丢弃。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-8-31 22:48:46 | 显示全部楼层
我调试了一下,应该是EOF后流的内容被系统截掉(包括回车键)。你照这思路理解一下,明白了别忘了给分
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-8-31 22:50:37 | 显示全部楼层
大头石 发表于 2012-8-31 22:48
我调试了一下,应该是EOF后流的内容被系统截掉(包括回车键)。你照这思路理解一下,明白了别忘了给分

差不多理解了。。。能再详细说一下吗?就差那么一点点我就像明白了 ,都想了2天了,然后查了不少资料,哎 感觉又点钻牛角尖了。我在想 这个问题是不是先放放,等学完 回过头来看一看
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-8-31 23:32:03 | 显示全部楼层
本帖最后由 the_one 于 2012-8-31 23:39 编辑
猪八哥 发表于 2012-8-31 22:50
差不多理解了。。。能再详细说一下吗?就差那么一点点我就像明白了 ,都想了2天了,然后查了不少资料,哎 ...

你用上面我发的程序试一下吧,比如输入"abc",会输出4个ok,读取到4个字符,即'a' 'b' 'c' '\n',若输入"abc^z",则只输出3个ok,EOF '\n'都被截取掉了,若输入"^z",则输出1个ok,'\n'被截取掉了,但EOF没有被截取

ch=getchar();
while(getchar()!='\n')
continue;
这段程序确实是输入字符窜。然后把第一个字符赋值给CH。剩下的丢弃,但要读取到'\n'才能结束,如果因为'\n'被截取掉而没有接收到,就要继续读取字符串,直到你输入了回车为止,才能正确执行下一次的第一个字符赋值给CH。剩下的丢弃,所以造成了要多回车一次的情况
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-1 01:06:29 | 显示全部楼层
有什么不明白的可以看看这篇文章:http://www.cnblogs.com/nuddle/archive/2010/04/25/1719768.html
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-1 09:14:11 | 显示全部楼层
  1. #include<stdio.h>
  2. #include<ctype.h>
  3. int main(void)
  4. {
  5. char get(void);
  6. int ch;

  7. while((ch=get())!=EOF)
  8. putchar(ch);
  9. return 0;
  10. }
  11. char get(void)
  12. {
  13. int ch;
  14. ch=getchar();
  15. if(ch == EOF)return EOF;
  16. while(getchar()!='\n')
  17. continue;
  18. return ch;
  19. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-9-1 10:46:32 | 显示全部楼层
大头石 发表于 2012-8-31 22:48
我调试了一下,应该是EOF后流的内容被系统截掉(包括回车键)。你照这思路理解一下,明白了别忘了给分

谢谢,,分不会给啊,,鱼币给了别人 ,哎 人太多。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-1 14:50:12 | 显示全部楼层
自己捉摸捉摸,调试调试。就好
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-10-29 04:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表