鱼C论坛

 找回密码
 立即注册
查看: 1666|回复: 14

[已解决]s1e14 测试题4 见了鬼的结果,求助为啥会这样。

[复制链接]
发表于 2022-6-8 16:10:12 | 显示全部楼层 |阅读模式

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

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

x
题目:用for循环写法代替while循环写法。
过程:自己的理解:for循环第一部分可以是一个定义式,那么定义ch读取一个字符。第二部分是结束条件判断:读取到了回车符(ch='\n').第三部分是循环部分:读取下一个字符(ch=getchar()。
结果:把这三个部分写进程序,编译没有出错,但是运行结果见了鬼了。
首先,没有输出字符(printf(“%c”,ch);)没有执行结果。既然循环了,为什么要跳过字符输出这一句?
其次,输出循环次数作为标记的时候发现,循环次数正好比我输入的字符数量多1.试了两次,都是一样的结果,由于没有每次循环伴随着输出字符,不知道为什么。
其三,两个输出语句都没有要求换行,输出的循环次数为什么会自动换了行?
其四:循环次数到了后,程序不再继续循环,而是停滞在那里,类似死循环了,不退出程序。为什么?

求达者帮忙看看:
  1. #include<stdio.h>

  2. int ch,count=0;

  3. int main()
  4. {
  5. printf("输入一串字符:");
  6. for ((ch=getchar());ch='\n';ch=getchar())
  7.         {       
  8.         count++;
  9.         printf("%c",ch);
  10.         printf("%d",count);
  11.         }       
  12. printf("end");






  13. return 0;
  14. }
复制代码


运行结果如下:
ty@ty-virtual-machine:~/fishc/s1e14$ gcc test4.c -o test4
ty@ty-virtual-machine:~/fishc/s1e14$ ./test4
输入一串字符:abcdefghijklmn

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15^C
ty@ty-virtual-machine:~/fishc/s1e14$ vim test4.c
ty@ty-virtual-machine:~/fishc/s1e14$ vim test4.c
ty@ty-virtual-machine:~/fishc/s1e14$ gcc test4.c -o test4
ty@ty-virtual-machine:~/fishc/s1e14$ ./test4
输入一串字符:kjhsdoifuywe

1
2
3
4
5
6
7
8
9
10
11
12
13^C
最佳答案
2022-6-8 16:32:15
本帖最后由 临时号 于 2022-6-8 16:36 编辑

ch='\n'改成ch!='\n',即ch不是\n的话,则继续执行for循环,如果按你的写法,ch='\n'一直为真,当然不会停止
  1. #include<stdio.h>

  2. int ch,count=0;

  3. int main()
  4. {
  5.         printf("输入一串字符:");
  6.         for ((ch=getchar());ch!='\n';ch=getchar())  // 这里的ch='\n'药改成ch!='\n'
  7.         {        
  8.         count++;
  9.         printf("%c",ch);
  10.         printf("%d",count);
  11.         }
  12.         printf("end");
  13.         return 0;
  14. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-6-8 16:29:47 | 显示全部楼层
本帖最后由 番杰 于 2022-6-8 16:32 编辑

代码第八行的for的判断条件:
ch='\n'有问题,
== 表示:判断前者是否等于后者,不是 = (两个等号);
!= 表示:判断前者是否不等于后者
ch='\n' 改成  ch !='\n'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-8 16:32:15 | 显示全部楼层    本楼为最佳答案   
本帖最后由 临时号 于 2022-6-8 16:36 编辑

ch='\n'改成ch!='\n',即ch不是\n的话,则继续执行for循环,如果按你的写法,ch='\n'一直为真,当然不会停止
  1. #include<stdio.h>

  2. int ch,count=0;

  3. int main()
  4. {
  5.         printf("输入一串字符:");
  6.         for ((ch=getchar());ch!='\n';ch=getchar())  // 这里的ch='\n'药改成ch!='\n'
  7.         {        
  8.         count++;
  9.         printf("%c",ch);
  10.         printf("%d",count);
  11.         }
  12.         printf("end");
  13.         return 0;
  14. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-8 19:57:01 | 显示全部楼层
临时号 发表于 2022-6-8 16:32
ch='\n'改成ch!='\n',即ch不是\n的话,则继续执行for循环,如果按你的写法,ch='\n'一直为真,当然不会停止

改为判断不为回车,确实进入了循环,所有见鬼的东西都正常了。
但是还有疑问。我的理解中,for循环第一段为循环起始的条件,第二段为符合时停止。那么读入字符串,还没有找到回车的时候,不是应该一直循环么?还有既然程序循环了,运行了,为什么会有一个语句(第11行)不运行呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-8 20:04:01 | 显示全部楼层
番杰 发表于 2022-6-8 16:29
代码第八行的for的判断条件:
ch='\n'有问题,
== 表示:判断前者是否等于后者,不是 = (两个等号);

for循环的三段内容我这样理解对不对?
第一段:循环起始点。在程序中间,运行到for循环的时候,只要符合第一段的要求就开始循环。
第二段:循环的终点。当循环多次后,符合了第二段的要求就终止循环。
第三段:循环节。每次循环要改变的循环内容。
这一段程序里,我的想法是,键盘输入字符串,程序从缓冲区里挨个读入,当读取到回车时,停止循环。那么为什么这里要用不等于(!=)呢?我尝试了用等于(==),结果一次循环也没有开始。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-8 20:11:42 | 显示全部楼层
啥也不输入直接按回车,它会进入循环体
  1. for ((ch=getchar());ch==\n';ch=getchar())
  2.         {      
  3.         count++;
  4.        // printf("%c",ch);
  5.         printf("Enter");
  6.         printf("%d",count);
  7.         }      
  8. printf("end");
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-8 20:30:23 | 显示全部楼层
本帖最后由 临时号 于 2022-6-8 20:37 编辑
顶级太阳 发表于 2022-6-8 19:57
改为判断不为回车,确实进入了循环,所有见鬼的东西都正常了。
但是还有疑问。我的理解中,for循环第一 ...


1.为什么第11行没有执行:
谁说没有执行,我们来看一下输出
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13^C
复制代码

是不是每一行都有一个回车,然而你的输出语句是这样的
  1. printf("%d",count);
复制代码

没有换行,那这个换行哪里来的当然是printf("%c",ch)给的
你的条件是ch='\n',c语言判断完条件后不就把ch设为\n了吗,所以第11行执行了
2.为什么改为==后不进入循环
因为条件是ch=='\n',你第一次不是\n时,for循环就已经结束了,你后面就算还有\n,程序也已经跳到printf("end")了
当你只输入回车时,循环进去了啊

没有看懂的话,可以回复我继续发问
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-6-8 21:42:32 | 显示全部楼层
临时号 发表于 2022-6-8 20:30
1.为什么第11行没有执行:
谁说没有执行,我们来看一下输出

还是回到我最初的程序。
比如说我输入的是abcdefg
那么程序第一次循环,读入了一个a。按照程序顺序应该是count=1,输出a。输出值1。然后进入第二次循环。
程序第二次循环,读入一个b。继续运行是count=2,然后输出b,输出值2.然后进入第三次循环



这个过程里没有换行符呀。直到循环运行了7次后,输出了g,输出值7,这时候程序才遇到第一个回车。
那么结果里,每一次循环遇到的回车怎么出来的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-8 22:02:55 | 显示全部楼层
本帖最后由 临时号 于 2022-6-8 22:28 编辑
顶级太阳 发表于 2022-6-8 21:42
还是回到我最初的程序。
比如说我输入的是abcdefg
那么程序第一次循环,读入了一个a。按照程序顺序应该 ...

  1. for ((ch=getchar());ch='\n';ch=getchar())
复制代码

这一行的条件中是不是ch='\n',不管你ch=getchar()这个定义初始化给ch什么值,之后的条件判断都会将ch='\n',然后你再printf("%c",ch);这不就有回车了吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-9 08:07:11 | 显示全部楼层
临时号 发表于 2022-6-8 22:02
这一行的条件中是不是ch='\n',不管你ch=getchar()这个定义初始化给ch什么值,之后的条件判断都会将ch= ...

你这个说法不敢苟同。这个初始化给了ch的值不同,但是都不是回车。只是循环到最后一次才出现回车。而不是没循环一次出现一个回车。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-9 13:08:35 | 显示全部楼层
顶级太阳 发表于 2022-6-9 08:07
你这个说法不敢苟同。这个初始化给了ch的值不同,但是都不是回车。只是循环到最后一次才出现回车。而不是 ...
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         char ch;
  5.         for (ch='f';ch='\n';ch='f')
  6.         {
  7.                 printf("%c",ch);
  8.         }
  9. }
复制代码

这个程序,你去运行一下,运行后程序会一直回车,虽然我初始化设置的是ch='f',但我的条件是ch='\n',你一直说你的输入中只有最后一次又回车,但是,这个回车是你在程序中写死的啊,初始化比条件判断先做,先初始化让ch=输入,然后条件判断让ch='\n'了,我换成while循环你应该会理解一些
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         char ch = getchar();
  5.         while(ch='\n')
  6.         {
  7.                 printf("%c",ch);
  8.                 ch = getchar();
  9.         }
  10. }
复制代码

你要知道,初始化比条件判断先做,条件判断内可以赋值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-9 15:57:07 | 显示全部楼层
临时号 发表于 2022-6-9 13:08
这个程序,你去运行一下,运行后程序会一直回车,虽然我初始化设置的是ch='f',但我的条件是ch='\n',你一直 ...

尝试了,确实如你所说。看起来是我对与for这个循环没有理解透。我再琢磨吧。谢谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-9 17:35:58 | 显示全部楼层
本帖最后由 番杰 于 2022-6-10 09:43 编辑
顶级太阳 发表于 2022-6-9 15:57
尝试了,确实如你所说。看起来是我对与for这个循环没有理解透。我再琢磨吧。谢谢。


我看了你和 临时号 的回答记录;
临时号说的对!

我再简单说下吧,本身for语句就是while的语法糖,
如果你不知道什么是语法糖的话,可以戳这里:什么是语法糖

你的这个for语句:
  1.          for (ch=getchar();ch='\n';ch=getchar())
  2.         {      
  3.              count++;
  4.              printf("%c",ch);
  5.              printf("%d",count);
  6.         }   
复制代码


还原成while的写法就是:
  1. ch=getchar();
  2. while(ch='\n')
  3. {  
  4.         count++;
  5.         printf("%c",ch);
  6.         printf("%d",count);
  7.         ch=getchar()   
  8. }
复制代码


你把判断条件写成了ch='\n';
这条语句本身就是个赋值语句,就是把ch的值换为'\n’(回车);
它在逻辑是真的(就是1),所以程序一直在这while循环里面,
退出不了这个循环,所以一直没有打印出end

你可能问,程序没停下来,那最后怎么打印东西了,
这个是因为,你只输入了那么多字符,在输入缓冲区中,
循环读到最后没有数值可以付给ch了,
即:ch=getchar()无法赋值了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-10 02:41:57 | 显示全部楼层
番杰 发表于 2022-6-9 17:35
我看了你和 顶级太阳 的回答记录;
顶级太阳说的对!

这个你是指代我还是顶级太阳,如果是我你为什么要回复顶级太阳
还有,你说的话不是在反驳顶级太阳吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-10 09:41:18 | 显示全部楼层
临时号 发表于 2022-6-10 02:41
这个你是指代我还是顶级太阳,如果是我你为什么要回复顶级太阳
还有,你说的话不是在反驳顶级太阳吗


我去,尴尬了!
我以为你是楼主,顶级太阳是回答问题的人,尴尬了!
太尴尬了,我重新回复一下
我被自己蠢哭了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-2 04:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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