s1e14 测试题4 见了鬼的结果,求助为啥会这样。
题目:用for循环写法代替while循环写法。过程:自己的理解:for循环第一部分可以是一个定义式,那么定义ch读取一个字符。第二部分是结束条件判断:读取到了回车符(ch='\n').第三部分是循环部分:读取下一个字符(ch=getchar()。
结果:把这三个部分写进程序,编译没有出错,但是运行结果见了鬼了。
首先,没有输出字符(printf(“%c”,ch);)没有执行结果。既然循环了,为什么要跳过字符输出这一句?
其次,输出循环次数作为标记的时候发现,循环次数正好比我输入的字符数量多1.试了两次,都是一样的结果,由于没有每次循环伴随着输出字符,不知道为什么。
其三,两个输出语句都没有要求换行,输出的循环次数为什么会自动换了行?
其四:循环次数到了后,程序不再继续循环,而是停滞在那里,类似死循环了,不退出程序。为什么?
求达者帮忙看看:
#include<stdio.h>
int ch,count=0;
int main()
{
printf("输入一串字符:");
for ((ch=getchar());ch='\n';ch=getchar())
{
count++;
printf("%c",ch);
printf("%d",count);
}
printf("end");
return 0;
}
运行结果如下:
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 编辑
代码第八行的for的判断条件:
ch='\n'有问题,
== 表示:判断前者是否等于后者,不是 = (两个等号);
!= 表示:判断前者是否不等于后者
ch='\n' 改成ch !='\n' 本帖最后由 临时号 于 2022-6-8 16:36 编辑
ch='\n'改成ch!='\n',即ch不是\n的话,则继续执行for循环,如果按你的写法,ch='\n'一直为真,当然不会停止
#include<stdio.h>
int ch,count=0;
int main()
{
printf("输入一串字符:");
for ((ch=getchar());ch!='\n';ch=getchar())// 这里的ch='\n'药改成ch!='\n'
{
count++;
printf("%c",ch);
printf("%d",count);
}
printf("end");
return 0;
} 临时号 发表于 2022-6-8 16:32
ch='\n'改成ch!='\n',即ch不是\n的话,则继续执行for循环,如果按你的写法,ch='\n'一直为真,当然不会停止
改为判断不为回车,确实进入了循环,所有见鬼的东西都正常了。
但是还有疑问。我的理解中,for循环第一段为循环起始的条件,第二段为符合时停止。那么读入字符串,还没有找到回车的时候,不是应该一直循环么?还有既然程序循环了,运行了,为什么会有一个语句(第11行)不运行呢? 番杰 发表于 2022-6-8 16:29
代码第八行的for的判断条件:
ch='\n'有问题,
== 表示:判断前者是否等于后者,不是 = (两个等号);
for循环的三段内容我这样理解对不对?
第一段:循环起始点。在程序中间,运行到for循环的时候,只要符合第一段的要求就开始循环。
第二段:循环的终点。当循环多次后,符合了第二段的要求就终止循环。
第三段:循环节。每次循环要改变的循环内容。
这一段程序里,我的想法是,键盘输入字符串,程序从缓冲区里挨个读入,当读取到回车时,停止循环。那么为什么这里要用不等于(!=)呢?我尝试了用等于(==),结果一次循环也没有开始。 啥也不输入直接按回车,它会进入循环体
for ((ch=getchar());ch==\n';ch=getchar())
{
count++;
// printf("%c",ch);
printf("Enter");
printf("%d",count);
}
printf("end"); 本帖最后由 临时号 于 2022-6-8 20:37 编辑
顶级太阳 发表于 2022-6-8 19:57
改为判断不为回车,确实进入了循环,所有见鬼的东西都正常了。
但是还有疑问。我的理解中,for循环第一 ...
1.为什么第11行没有执行:
谁说没有执行,我们来看一下输出
1
2
3
4
5
6
7
8
9
10
11
12
13^C
是不是每一行都有一个回车,然而你的输出语句是这样的
printf("%d",count);
没有换行,那这个换行哪里来的当然是printf("%c",ch)给的
你的条件是ch='\n',c语言判断完条件后不就把ch设为\n了吗,所以第11行执行了
2.为什么改为==后不进入循环
因为条件是ch=='\n',你第一次不是\n时,for循环就已经结束了,你后面就算还有\n,程序也已经跳到printf("end")了
当你只输入回车时,循环进去了啊
没有看懂的话,可以回复我继续发问 临时号 发表于 2022-6-8 20:30
1.为什么第11行没有执行:
谁说没有执行,我们来看一下输出
还是回到我最初的程序。
比如说我输入的是abcdefg
那么程序第一次循环,读入了一个a。按照程序顺序应该是count=1,输出a。输出值1。然后进入第二次循环。
程序第二次循环,读入一个b。继续运行是count=2,然后输出b,输出值2.然后进入第三次循环
。
。
。
这个过程里没有换行符呀。直到循环运行了7次后,输出了g,输出值7,这时候程序才遇到第一个回车。
那么结果里,每一次循环遇到的回车怎么出来的? 本帖最后由 临时号 于 2022-6-8 22:28 编辑
顶级太阳 发表于 2022-6-8 21:42
还是回到我最初的程序。
比如说我输入的是abcdefg
那么程序第一次循环,读入了一个a。按照程序顺序应该 ...
for ((ch=getchar());ch='\n';ch=getchar())
这一行的条件中是不是ch='\n',不管你ch=getchar()这个定义初始化给ch什么值,之后的条件判断都会将ch='\n',然后你再printf("%c",ch);这不就有回车了吗 临时号 发表于 2022-6-8 22:02
这一行的条件中是不是ch='\n',不管你ch=getchar()这个定义初始化给ch什么值,之后的条件判断都会将ch= ...
你这个说法不敢苟同。这个初始化给了ch的值不同,但是都不是回车。只是循环到最后一次才出现回车。而不是没循环一次出现一个回车。 顶级太阳 发表于 2022-6-9 08:07
你这个说法不敢苟同。这个初始化给了ch的值不同,但是都不是回车。只是循环到最后一次才出现回车。而不是 ...
#include <stdio.h>
int main()
{
char ch;
for (ch='f';ch='\n';ch='f')
{
printf("%c",ch);
}
}
这个程序,你去运行一下,运行后程序会一直回车,虽然我初始化设置的是ch='f',但我的条件是ch='\n',你一直说你的输入中只有最后一次又回车,但是,这个回车是你在程序中写死的啊,初始化比条件判断先做,先初始化让ch=输入,然后条件判断让ch='\n'了,我换成while循环你应该会理解一些
#include <stdio.h>
int main()
{
char ch = getchar();
while(ch='\n')
{
printf("%c",ch);
ch = getchar();
}
}
你要知道,初始化比条件判断先做,条件判断内可以赋值 临时号 发表于 2022-6-9 13:08
这个程序,你去运行一下,运行后程序会一直回车,虽然我初始化设置的是ch='f',但我的条件是ch='\n',你一直 ...
尝试了,确实如你所说。看起来是我对与for这个循环没有理解透。我再琢磨吧。谢谢。 本帖最后由 番杰 于 2022-6-10 09:43 编辑
顶级太阳 发表于 2022-6-9 15:57
尝试了,确实如你所说。看起来是我对与for这个循环没有理解透。我再琢磨吧。谢谢。
我看了你和 临时号 的回答记录;
临时号说的对!{:10_297:}
我再简单说下吧,本身for语句就是while的语法糖,
如果你不知道什么是语法糖的话,可以戳这里:什么是语法糖;
你的这个for语句:
for (ch=getchar();ch='\n';ch=getchar())
{
count++;
printf("%c",ch);
printf("%d",count);
}
还原成while的写法就是:
ch=getchar();
while(ch='\n')
{
count++;
printf("%c",ch);
printf("%d",count);
ch=getchar()
}
你把判断条件写成了ch='\n';
这条语句本身就是个赋值语句,就是把ch的值换为'\n’(回车);
它在逻辑是真的(就是1),所以程序一直在这while循环里面,
退出不了这个循环,所以一直没有打印出end
你可能问,程序没停下来,那最后怎么打印东西了,
这个是因为,你只输入了那么多字符,在输入缓冲区中,
循环读到最后没有数值可以付给ch了,
即:ch=getchar()无法赋值了。 番杰 发表于 2022-6-9 17:35
我看了你和 顶级太阳 的回答记录;
顶级太阳说的对!
这个你是指代我还是顶级太阳,如果是我你为什么要回复顶级太阳
还有,你说的话不是在反驳顶级太阳吗 临时号 发表于 2022-6-10 02:41
这个你是指代我还是顶级太阳,如果是我你为什么要回复顶级太阳
还有,你说的话不是在反驳顶级太阳吗
我去,尴尬了!
我以为你是楼主,顶级太阳是回答问题的人,尴尬了!
太尴尬了,我重新回复一下
我被自己蠢哭了{:10_266:}
页:
[1]