鱼C论坛

 找回密码
 立即注册
查看: 4140|回复: 15

[已解决]大佬们帮忙看看为什么不能跳出循环啊

[复制链接]
发表于 2022-11-17 15:14:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这是一个只输出数字且只输出一组数字的程序,比如输入adw789awd455adw,他只会输出789
我这个程序本该是在第一组数字输出后跳出循环,但是现在不知道为啥无法跳出,会输出两组数字
  1. #include<stdio.h>
  2. int main()
  3. {
  4.         int a,c;
  5.         int b;
  6.         a=0;
  7.         while((b=getchar())!='\n')              \\循环的条件是b不等于回车
  8.         {       
  9.                 if(b>='0'&&b<='9')
  10.                 {   
  11.                         printf("%c",b);
  12.                         c=getchar();
  13.                         if(c>'9')
  14.                         {
  15.                                 b='\n';                    \\这里检索到数字后面接着字母后就应该跳出循环,但是不知为啥无法跳出
  16.                         }
  17.                         else
  18.                         {
  19.                                 printf("%c",c);
  20.                         }
  21.                                
  22.                                        
  23.                 }
  24.                 if(b=='.')
  25.                 {
  26.                         break;
  27.                 }
  28.        
  29.         }
  30.        
  31.        
  32.        
  33.        
  34.        
  35.        
  36.         return 0;
  37. }
复制代码
最佳答案
2022-11-17 15:32:00
本帖最后由 zhangjinxuan 于 2022-11-17 16:14 编辑

你的程序思路不是很对,重写了一下:
  1. #include <stdio.h>

  2. int main() {
  3.         char b;
  4.         int find_number = 0;
  5.         while ((b = getchar()) != '\n') {
  6.                 if (b >= '0' && b <= '9') {
  7.                         printf("%c", b);
  8.                         find_number = 1;
  9.                 } else {
  10.                         if (find_number) return 0;
  11.                 }
  12.         }
  13.     return 0;
  14. }
复制代码

就是说先记一个变量,遇到数字把变量设置为真,如果不是数字,并且遇到过数字,说明第一个数字已经读完了,输出完了,就不需要执行下去了,直接退出

你的代码因为新的一轮循环就已经把 b 给覆盖掉了,所以你在 b = '\n' 也没有任何的作用

如果要在你的代码基础上改的话,可以这么改,不过因为思路不是很对,所以也难免有错:
  1. #include<stdio.h>
  2. int main()
  3. {
  4.         int a,c;
  5.         int b;
  6.         a=0;
  7.         while((b=getchar())!='\n')
  8.         {        
  9.                 if(b>='0'&&b<='9')
  10.                 {   
  11.                         printf("%c",b);
  12.                         c=getchar();
  13.                         if(c>'9')
  14.                         {
  15.                                 b='\n';
  16.                         }
  17.                         else
  18.                         {
  19.                                 printf("%c",c);
  20.                         }
  21.                                 
  22.                                        
  23.                 }
  24.                 if(b=='\n') //判断条件改一改就可以了
  25.                 {
  26.                         break;
  27.                 }
  28.         
  29.         }
  30.         return 0;
  31. }
复制代码


还有啊,代码注释应该是 //,不是 \\,你的代码那两个地方写错了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-11-17 15:32:00 | 显示全部楼层    本楼为最佳答案   
本帖最后由 zhangjinxuan 于 2022-11-17 16:14 编辑

你的程序思路不是很对,重写了一下:
  1. #include <stdio.h>

  2. int main() {
  3.         char b;
  4.         int find_number = 0;
  5.         while ((b = getchar()) != '\n') {
  6.                 if (b >= '0' && b <= '9') {
  7.                         printf("%c", b);
  8.                         find_number = 1;
  9.                 } else {
  10.                         if (find_number) return 0;
  11.                 }
  12.         }
  13.     return 0;
  14. }
复制代码

就是说先记一个变量,遇到数字把变量设置为真,如果不是数字,并且遇到过数字,说明第一个数字已经读完了,输出完了,就不需要执行下去了,直接退出

你的代码因为新的一轮循环就已经把 b 给覆盖掉了,所以你在 b = '\n' 也没有任何的作用

如果要在你的代码基础上改的话,可以这么改,不过因为思路不是很对,所以也难免有错:
  1. #include<stdio.h>
  2. int main()
  3. {
  4.         int a,c;
  5.         int b;
  6.         a=0;
  7.         while((b=getchar())!='\n')
  8.         {        
  9.                 if(b>='0'&&b<='9')
  10.                 {   
  11.                         printf("%c",b);
  12.                         c=getchar();
  13.                         if(c>'9')
  14.                         {
  15.                                 b='\n';
  16.                         }
  17.                         else
  18.                         {
  19.                                 printf("%c",c);
  20.                         }
  21.                                 
  22.                                        
  23.                 }
  24.                 if(b=='\n') //判断条件改一改就可以了
  25.                 {
  26.                         break;
  27.                 }
  28.         
  29.         }
  30.         return 0;
  31. }
复制代码


还有啊,代码注释应该是 //,不是 \\,你的代码那两个地方写错了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-17 15:43:18 | 显示全部楼层
  1. #include<stdio.h>
  2. int main()
  3. {
  4.         int a = 0 ;
  5.         char b    ;
  6.         while((b = getchar()) !='\n')   // 此 getchar() 应当成为字符 b 的唯一来源
  7.         {        
  8.                 if(b >= '0' && b <= '9')
  9.                 {   
  10.                         printf(" %c" , b) ;
  11.                         a ++              ;
  12.                 }
  13.                 else
  14.                 {
  15.                         if(a) break       ;
  16.                 }
  17.         }
  18. }
复制代码

评分

参与人数 1鱼币 +1 收起 理由
清如许 + 1 感谢

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-11-17 15:44:43 | 显示全部楼层
虽然你在判断 c > '9' 时把 b 设为了 '\n',但是在下一轮循环开始前,还是会执行 (b = getchar()) != '\n' 这一条语句, 这导致 b 再次被输入赋值,从而改变了 b 的值

解决方法:发现 c 不满足条件时就直接用 break 跳出循环
  1. #include<stdio.h>
  2. int main()
  3. {
  4.         int a,c;
  5.         int b;
  6.         a=0;
  7.         while((b=getchar())!='\n')        
  8.         {        
  9.                 if(b>='0'&&b<='9')
  10.                 {   
  11.                         printf("%c",b);
  12.                         c=getchar();
  13.                         if(c>'9' || c<'0')
  14.                         {
  15.                                 break;                  
  16.                         }
  17.                         else
  18.                         {
  19.                                 printf("%c",c);
  20.                         }
  21.                                 
  22.                                        
  23.                 }
  24.                 if(b=='.')
  25.                 {
  26.                         break;
  27.                 }
  28.         
  29.         }
  30.         
  31.         
  32.         
  33.         
  34.         
  35.         
  36.         return 0;
  37. }
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
清如许 + 1 + 1 感谢

查看全部评分

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

使用道具 举报

 楼主| 发表于 2022-11-17 15:48:50 | 显示全部楼层
zhangjinxuan 发表于 2022-11-17 15:32
你的程序思路不是很对,重写了一下:

就是说先记一个变量,遇到数字把变量设置为真,如果不是数字,并且 ...

太感谢了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-17 15:49:30 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-17 15:50:05 | 显示全部楼层
tommyyu 发表于 2022-11-17 15:44
虽然你在判断 c > '9' 时把 b 设为了 '\n',但是在下一轮循环开始前,还是会执行 (b = getchar()) != '\n'  ...

感激不尽
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-17 16:10:16 | 显示全部楼层
zhangjinxuan 发表于 2022-11-17 15:32
你的程序思路不是很对,重写了一下:

就是说先记一个变量,遇到数字把变量设置为真,如果不是数字,并且 ...

大佬,不行啊,按你说的在我的代码上改了,还是无法跳出循环,最终还是输出了两组数据
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-17 16:11:36 | 显示全部楼层
本帖最后由 zhangjinxuan 于 2022-11-17 16:15 编辑
清如许 发表于 2022-11-17 16:10
大佬,不行啊,按你说的在我的代码上改了,还是无法跳出循环,最终还是输出了两组数据


用第一个代码,因为代码思路不对,所以难改对

用这个:
  1. #include <stdio.h>

  2. int main() {
  3.         char b;
  4.         int find_number = 0;
  5.         while ((b = getchar()) != '\n') {
  6.                 if (b >= '0' && b <= '9') {
  7.                         printf("%c", b);
  8.                         find_number = 1;
  9.                 } else {
  10.                         if (find_number) return 0;
  11.                 }
  12.         }
  13.     return 0;
  14. }
复制代码


还是你想说,这个也不对???
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-17 16:14:20 | 显示全部楼层
你给程序输入的是什么,我非常好奇
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-17 16:19:16 | 显示全部楼层
zhangjinxuan 发表于 2022-11-17 16:14
你给程序输入的是什么,我非常好奇

我输入的是adw789wda45adw,按道理他应该只输出789,但是他输出了78945
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-17 16:19:46 | 显示全部楼层
zhangjinxuan 发表于 2022-11-17 16:11
用第一个代码,因为代码思路不对,所以难改对

用这个:

这个没试过,我来试试
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-17 16:20:33 | 显示全部楼层
清如许 发表于 2022-11-17 16:19
我输入的是adw789wda45adw,按道理他应该只输出789,但是他输出了78945

我这边并没有输出78945
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-17 16:33:38 | 显示全部楼层
zhangjinxuan 发表于 2022-11-17 16:20
我这边并没有输出78945


                               
登录/注册后可看大图
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-17 16:34:23 | 显示全部楼层
zhangjinxuan 发表于 2022-11-17 16:20
我这边并没有输出78945


                               
登录/注册后可看大图
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-17 17:00:57 | 显示全部楼层

说了用这个呀:
  1. #include <stdio.h>

  2. int main() {
  3.         char b;
  4.         int find_number = 0;
  5.         while ((b = getchar()) != '\n') {
  6.                 if (b >= '0' && b <= '9') {
  7.                         printf("%c", b);
  8.                         find_number = 1;
  9.                 } else {
  10.                         if (find_number) return 0;
  11.                 }
  12.         }
  13.     return 0;
  14. }
复制代码

如果你的思路错了,那么写的代码就很难正确了,改也不一定改对
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-22 22:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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