user-0 提问: 关于continue在C语言程序中的问题

回复:
user: user-1
content: 要想一直检测输入，参考下面：#include <conio.h> #include <stdio.h> char pw[40]; int i,ch; FILE *f; void main() { 	cprintf("\r\nPassword:"); 	i=0;pw[i]=0; 	while (1) { 		ch=getch(); 		if (ch==13 || i>=39) break; 		switch (ch)	{ 		case 27: 			cprintf("\rPassword: %40s"," "); 			cprintf("\rPassword: "); 			i=0;pw[i]=0; 			break; 		case 8: 			if (i>0) { 				i--; 				pw[i]=0; 				cprintf("\b \b"); 			} 			break; 		default: 			pw[i]=ch; 			i++; 			pw[i]=0; 			cprintf("*"); 			break; 		} 	} 	cprintf("\r\n"); 	f=fopen("password.txt","w"); 	fprintf(f,"%s\n",pw); 	fclose(f); }

user: user-2
content: 引用 14 楼 zaixiankaifa 的回复:[quote=引用 13 楼 zaixiankaifa 的回复:] [quote=引用 11 楼 shihengzhen101 的回复:] [quote=引用 6 楼 zaixiankaifa 的回复:] [quote=引用 5 楼 shihengzhen101 的回复:] [quote=引用 3 楼 zaixiankaifa 的回复:] [quote=引用 2 楼 shihengzhen101 的回复:] continue是跳过此次循环，break是结束循环，查一下continue和break的区别就明白了  那为什么在if('\n'==c)continue;之后的printf("the input is %c\n",c)还是会执行打印操作? 按理说不是要跳过这次循环了吗,printf("the input is %c\n",c)也属于循环体的一部分呀,为什么不跳过呢?[/quote] 你的回车是在哪里输入的，把输入输出注释清楚的吧，那个hello是哪来的？[/quote]   我是这样输入和回车的,我输入字符之后马上就按回车键了,但是不明白为什么continue之后还是会有printf输出,按道理说回车代表'\r\n',这样的话我按了回车之后直接不执行printf语句了,麻烦看下为什么  运行结果: 输入:e回车 输出:the input is c 输入:w回车 输出:the input is w 输入:t回车 输出:the input is t  输入:hello回车 输出:the input is h 输出:the input is e 输出:the input is l 输出:the input is l 输出:the input is o [/quote]  下面值分析这组结果： 输入:hello回车 输出:the input is h 输出:the input is e 输出:the input is l 输出:the input is l 输出:the input is o  输入hello后按回车 程序循环读到第一个字母h，发现不是回车，输出h，然后也不是q，程序继续运行 继续读到下一个字母e，发现不是回车，输出e，然后也不是q，程序继续运行 继续读到下一个字母l，发现不是回车，输出l，然后也不是q，程序继续运行 继续读到下一个字母l，发现不是回车，输出l，然后也不是q，程序继续运行 继续读到下一个字母o，发现不是回车，输出o，然后也不是q，程序继续运行 继续读到下一个字符'\n'，也就是回车，跳过此次循环，程序继续运行  如果你继续输入不是回车也不是q的字母还会继续输出 [/quote]   如果按照你这么分析的话, 我输入"hello"这五个字符, 程序是先第一次循环读取'h',发现既不是'\n'也不是'q'后,打印'h'字符,然后再一次通过循环读取下一个字符?  而不是程序一次性读取"hello",把"hello"保存到缓冲区,然后再通过循环一次次判断字符是否等于'\n'或'q'再打印?[/quote]  我想了想,如果按照你之前回答,当读取"hello"的时候,先判断第一个字符"h",发现不是'\n',那么就应该通过printf马上打印"h"这个字符,也即是说,当我输入一个字符"h"的时候,程序应该马上就打印出来,同理,继续判断剩余的字符,并打印字符;而不是现在运行的结果: 先输入"hello",并没有马上通过printf打印,最后才一次性打印五个字符.  红色这部分,是我比较疑惑的地方.[/quote] 可以说程序是把hello\n直接一次读入缓冲区的，有一点你需要明白，你的当前程序不会一直检测你的输入，也就是你输入h后并不会被你现在的程序知晓，什么时候开始读呢？其实就是你输入回车之后，程序才把这些内容读入了缓冲区，但是这些字符存在缓冲区还是黑框框中，你是不需要关心的

user: user-3
content: 引用 6 楼 zaixiankaifa 的回复:[quote=引用 5 楼 shihengzhen101 的回复:] [quote=引用 3 楼 zaixiankaifa 的回复:] [quote=引用 2 楼 shihengzhen101 的回复:] continue是跳过此次循环，break是结束循环，查一下continue和break的区别就明白了  那为什么在if('\n'==c)continue;之后的printf("the input is %c\n",c)还是会执行打印操作? 按理说不是要跳过这次循环了吗,printf("the input is %c\n",c)也属于循环体的一部分呀,为什么不跳过呢?[/quote] 你的回车是在哪里输入的，把输入输出注释清楚的吧，那个hello是哪来的？[/quote]   我是这样输入和回车的,我输入字符之后马上就按回车键了,但是不明白为什么continue之后还是会有printf输出,按道理说回车代表'\r\n',这样的话我按了回车之后直接不执行printf语句了,麻烦看下为什么  运行结果: 输入:e回车 输出:the input is c 输入:w回车 输出:the input is w 输入:t回车 输出:the input is t  输入:hello回车 输出:the input is h 输出:the input is e 输出:the input is l 输出:the input is l 输出:the input is o [/quote] 加断点。 调试看看你输入了“e 回车” 后 c 是多少？

user: user-4
content: 还以为楼主遇到了什么灵异事件，果然还是没有理解continue和break的区别……

user: user-0
content: 引用 5 楼 shihengzhen101 的回复:[quote=引用 3 楼 zaixiankaifa 的回复:] [quote=引用 2 楼 shihengzhen101 的回复:] continue是跳过此次循环，break是结束循环，查一下continue和break的区别就明白了  那为什么在if('\n'==c)continue;之后的printf("the input is %c\n",c)还是会执行打印操作? 按理说不是要跳过这次循环了吗,printf("the input is %c\n",c)也属于循环体的一部分呀,为什么不跳过呢?[/quote] 你的回车是在哪里输入的，把输入输出注释清楚的吧，那个hello是哪来的？[/quote]   我是这样输入和回车的,我输入字符之后马上就按回车键了,但是不明白为什么continue之后还是会有printf输出,按道理说回车代表'\r\n',这样的话我按了回车之后直接不执行printf语句了,麻烦看下为什么  运行结果: 输入:e回车 输出:the input is c 输入:w回车 输出:the input is w 输入:t回车 输出:the input is t  输入:hello回车 输出:the input is h 输出:the input is e 输出:the input is l 输出:the input is l 输出:the input is o

user: user-2
content: 引用 3 楼 zaixiankaifa 的回复:[quote=引用 2 楼 shihengzhen101 的回复:] continue是跳过此次循环，break是结束循环，查一下continue和break的区别就明白了  那为什么在if('\n'==c)continue;之后的printf("the input is %c\n",c)还是会执行打印操作? 按理说不是要跳过这次循环了吗,printf("the input is %c\n",c)也属于循环体的一部分呀,为什么不跳过呢?[/quote] 你的回车是在哪里输入的，把输入输出注释清楚的吧，那个hello是哪来的？

user: user-3
content: 引用 3 楼 zaixiankaifa 的回复:[quote=引用 2 楼 shihengzhen101 的回复:] continue是跳过此次循环，break是结束循环，查一下continue和break的区别就明白了  那为什么在if('\n'==c)continue;之后的printf("the input is %c\n",c)还是会执行打印操作? 按理说不是要跳过这次循环了吗,printf("the input is %c\n",c)也属于循环体的一部分呀,为什么不跳过呢?[/quote] 因为 c不等于 ‘\n’

user: user-0
content: 引用 2 楼 shihengzhen101 的回复:continue是跳过此次循环，break是结束循环，查一下continue和break的区别就明白了  那为什么在if('\n'==c)continue;之后的printf("the input is %c\n",c)还是会执行打印操作? 按理说不是要跳过这次循环了吗,printf("the input is %c\n",c)也属于循环体的一部分呀,为什么不跳过呢?

user: user-2
content: continue是跳过此次循环，break是结束循环，查一下continue和break的区别就明白了

user: user-4
content: http://zh.cppreference.com/w/cpp/language/continue http://zh.cppreference.com/w/cpp/language/break 楼主怕是混淆了continue和break？

user: user-4
content: 看来楼主需要搜索一下“键盘缓冲区”的概念

user: user-0
content: 引用 13 楼 zaixiankaifa 的回复:[quote=引用 11 楼 shihengzhen101 的回复:] [quote=引用 6 楼 zaixiankaifa 的回复:] [quote=引用 5 楼 shihengzhen101 的回复:] [quote=引用 3 楼 zaixiankaifa 的回复:] [quote=引用 2 楼 shihengzhen101 的回复:] continue是跳过此次循环，break是结束循环，查一下continue和break的区别就明白了  那为什么在if('\n'==c)continue;之后的printf("the input is %c\n",c)还是会执行打印操作? 按理说不是要跳过这次循环了吗,printf("the input is %c\n",c)也属于循环体的一部分呀,为什么不跳过呢?[/quote] 你的回车是在哪里输入的，把输入输出注释清楚的吧，那个hello是哪来的？[/quote]   我是这样输入和回车的,我输入字符之后马上就按回车键了,但是不明白为什么continue之后还是会有printf输出,按道理说回车代表'\r\n',这样的话我按了回车之后直接不执行printf语句了,麻烦看下为什么  运行结果: 输入:e回车 输出:the input is c 输入:w回车 输出:the input is w 输入:t回车 输出:the input is t  输入:hello回车 输出:the input is h 输出:the input is e 输出:the input is l 输出:the input is l 输出:the input is o [/quote]  下面值分析这组结果： 输入:hello回车 输出:the input is h 输出:the input is e 输出:the input is l 输出:the input is l 输出:the input is o  输入hello后按回车 程序循环读到第一个字母h，发现不是回车，输出h，然后也不是q，程序继续运行 继续读到下一个字母e，发现不是回车，输出e，然后也不是q，程序继续运行 继续读到下一个字母l，发现不是回车，输出l，然后也不是q，程序继续运行 继续读到下一个字母l，发现不是回车，输出l，然后也不是q，程序继续运行 继续读到下一个字母o，发现不是回车，输出o，然后也不是q，程序继续运行 继续读到下一个字符'\n'，也就是回车，跳过此次循环，程序继续运行  如果你继续输入不是回车也不是q的字母还会继续输出 [/quote]   如果按照你这么分析的话, 我输入"hello"这五个字符, 程序是先第一次循环读取'h',发现既不是'\n'也不是'q'后,打印'h'字符,然后再一次通过循环读取下一个字符?  而不是程序一次性读取"hello",把"hello"保存到缓冲区,然后再通过循环一次次判断字符是否等于'\n'或'q'再打印?[/quote]  我想了想,如果按照你之前回答,当读取"hello"的时候,先判断第一个字符"h",发现不是'\n',那么就应该通过printf马上打印"h"这个字符,也即是说,当我输入一个字符"h"的时候,程序应该马上就打印出来,同理,继续判断剩余的字符,并打印字符;而不是现在运行的结果: 先输入"hello",并没有马上通过printf打印,最后才一次性打印五个字符.  红色这部分,是我比较疑惑的地方.

user: user-0
content: 引用 11 楼 shihengzhen101 的回复:[quote=引用 6 楼 zaixiankaifa 的回复:] [quote=引用 5 楼 shihengzhen101 的回复:] [quote=引用 3 楼 zaixiankaifa 的回复:] [quote=引用 2 楼 shihengzhen101 的回复:] continue是跳过此次循环，break是结束循环，查一下continue和break的区别就明白了  那为什么在if('\n'==c)continue;之后的printf("the input is %c\n",c)还是会执行打印操作? 按理说不是要跳过这次循环了吗,printf("the input is %c\n",c)也属于循环体的一部分呀,为什么不跳过呢?[/quote] 你的回车是在哪里输入的，把输入输出注释清楚的吧，那个hello是哪来的？[/quote]   我是这样输入和回车的,我输入字符之后马上就按回车键了,但是不明白为什么continue之后还是会有printf输出,按道理说回车代表'\r\n',这样的话我按了回车之后直接不执行printf语句了,麻烦看下为什么  运行结果: 输入:e回车 输出:the input is c 输入:w回车 输出:the input is w 输入:t回车 输出:the input is t  输入:hello回车 输出:the input is h 输出:the input is e 输出:the input is l 输出:the input is l 输出:the input is o [/quote]  下面值分析这组结果： 输入:hello回车 输出:the input is h 输出:the input is e 输出:the input is l 输出:the input is l 输出:the input is o  输入hello后按回车 程序循环读到第一个字母h，发现不是回车，输出h，然后也不是q，程序继续运行 继续读到下一个字母e，发现不是回车，输出e，然后也不是q，程序继续运行 继续读到下一个字母l，发现不是回车，输出l，然后也不是q，程序继续运行 继续读到下一个字母l，发现不是回车，输出l，然后也不是q，程序继续运行 继续读到下一个字母o，发现不是回车，输出o，然后也不是q，程序继续运行 继续读到下一个字符'\n'，也就是回车，跳过此次循环，程序继续运行  如果你继续输入不是回车也不是q的字母还会继续输出 [/quote]   如果按照你这么分析的话, 我输入"hello"这五个字符, 程序是先第一次循环读取'h',发现既不是'\n'也不是'q'后,打印'h'字符,然后再一次通过循环读取下一个字符?  而不是程序一次性读取"hello",把"hello"保存到缓冲区,然后再通过循环一次次判断字符是否等于'\n'或'q'再打印?

user: user-1
content: '\r' ?

user: user-2
content: 引用 6 楼 zaixiankaifa 的回复:[quote=引用 5 楼 shihengzhen101 的回复:] [quote=引用 3 楼 zaixiankaifa 的回复:] [quote=引用 2 楼 shihengzhen101 的回复:] continue是跳过此次循环，break是结束循环，查一下continue和break的区别就明白了  那为什么在if('\n'==c)continue;之后的printf("the input is %c\n",c)还是会执行打印操作? 按理说不是要跳过这次循环了吗,printf("the input is %c\n",c)也属于循环体的一部分呀,为什么不跳过呢?[/quote] 你的回车是在哪里输入的，把输入输出注释清楚的吧，那个hello是哪来的？[/quote]   我是这样输入和回车的,我输入字符之后马上就按回车键了,但是不明白为什么continue之后还是会有printf输出,按道理说回车代表'\r\n',这样的话我按了回车之后直接不执行printf语句了,麻烦看下为什么  运行结果: 输入:e回车 输出:the input is c 输入:w回车 输出:the input is w 输入:t回车 输出:the input is t  输入:hello回车 输出:the input is h 输出:the input is e 输出:the input is l 输出:the input is l 输出:the input is o [/quote]  下面值分析这组结果： 输入:hello回车 输出:the input is h 输出:the input is e 输出:the input is l 输出:the input is l 输出:the input is o  输入hello后按回车 程序循环读到第一个字母h，发现不是回车，输出h，然后也不是q，程序继续运行 继续读到下一个字母e，发现不是回车，输出e，然后也不是q，程序继续运行 继续读到下一个字母l，发现不是回车，输出l，然后也不是q，程序继续运行 继续读到下一个字母l，发现不是回车，输出l，然后也不是q，程序继续运行 继续读到下一个字母o，发现不是回车，输出o，然后也不是q，程序继续运行 继续读到下一个字符'\n'，也就是回车，跳过此次循环，程序继续运行  如果你继续输入不是回车也不是q的字母还会继续输出

user: user-2
content: 引用 8 楼 hdt 的回复:[quote=引用 6 楼 zaixiankaifa 的回复:] [quote=引用 5 楼 shihengzhen101 的回复:] [quote=引用 3 楼 zaixiankaifa 的回复:] [quote=引用 2 楼 shihengzhen101 的回复:] continue是跳过此次循环，break是结束循环，查一下continue和break的区别就明白了  那为什么在if('\n'==c)continue;之后的printf("the input is %c\n",c)还是会执行打印操作? 按理说不是要跳过这次循环了吗,printf("the input is %c\n",c)也属于循环体的一部分呀,为什么不跳过呢?[/quote] 你的回车是在哪里输入的，把输入输出注释清楚的吧，那个hello是哪来的？[/quote]   我是这样输入和回车的,我输入字符之后马上就按回车键了,但是不明白为什么continue之后还是会有printf输出,按道理说回车代表'\r\n',这样的话我按了回车之后直接不执行printf语句了,麻烦看下为什么  运行结果: 输入:e回车 输出:the input is c 输入:w回车 输出:the input is w 输入:t回车 输出:the input is t  输入:hello回车 输出:the input is h 输出:the input is e 输出:the input is l 输出:the input is l 输出:the input is o [/quote] 加断点。 调试看看你输入了“e 回车” 后 c 是多少？[/quote] 你的结果里只有e和c这组对应很奇怪，其他都正常，这个程序输出回车不会停止，而是跳过回车这个字符 并且这一句if('q==c')break;也有问题，我感觉本意应该是输入q退出程序，应该写成if('q'==c)break;  下面值分析这组结果：

user: user-1
content: 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！