关于continue在C语言程序中的问题

zaixiankaifa 2018-03-17 10:46:33
#include <sys/time.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <assert.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <sys/select.h>


int main()
{
int keyboard;
int ret,i;
char c;
fd_set readfd;
struct timeval timeout;
keyboard=open("/dev/tty",O_RDONLY | O_NONBLOCK);
assert(keyboard>0);
while(1)
{
timeout.tv_sec=1;
timeout.tv_usec=0;
FD_ZERO(keyboard,&readfd);
FD_SET(keyboard,&readfd);
ret=select(keyboard+1,&readfd,NULL,NULL,&timeout);
if(FD_ISSET(keyboard,&readfd)
{
i=read(keyboard,&c,1);
if('\n'==c)continue;
printf("the input is %c\n",c);
if('q==c')break;
}
}
return 0;
}

运行结果:
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



我是在CentOS 7 执行该程序,使用select判断终端输入的时候,如果输入字母则会读取,然后通过printf输出,但是为什么当执行回车键时,这个语句块 if('\n'==c)comtinue;不是应该就中断该循环吗,为什么还会有printf输出? 不应该有输出呀, continue直接中断该循环,不会执行后续语句,难道我理解错了? 求解.......
...全文
978 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-03-19
  • 打赏
  • 举报
回复
要想一直检测输入,参考下面:
#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);
}
AlbertS 2018-03-19
  • 打赏
  • 举报
回复
引用 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后并不会被你现在的程序知晓,什么时候开始读呢?其实就是你输入回车之后,程序才把这些内容读入了缓冲区,但是这些字符存在缓冲区还是黑框框中,你是不需要关心的
真相重于对错 2018-03-17
  • 打赏
  • 举报
回复
引用 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 是多少?
mstlq 2018-03-17
  • 打赏
  • 举报
回复
还以为楼主遇到了什么灵异事件,果然还是没有理解continue和break的区别……
zaixiankaifa 2018-03-17
  • 打赏
  • 举报
回复
引用 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
AlbertS 2018-03-17
  • 打赏
  • 举报
回复
引用 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是哪来的?
真相重于对错 2018-03-17
  • 打赏
  • 举报
回复
引用 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’
zaixiankaifa 2018-03-17
  • 打赏
  • 举报
回复
引用 2 楼 shihengzhen101 的回复:
continue是跳过此次循环,break是结束循环,查一下continue和break的区别就明白了
那为什么在if('\n'==c)continue;之后的printf("the input is %c\n",c)还是会执行打印操作? 按理说不是要跳过这次循环了吗,printf("the input is %c\n",c)也属于循环体的一部分呀,为什么不跳过呢?
AlbertS 2018-03-17
  • 打赏
  • 举报
回复
continue是跳过此次循环,break是结束循环,查一下continue和break的区别就明白了
mstlq 2018-03-17
  • 打赏
  • 举报
回复
mstlq 2018-03-17
  • 打赏
  • 举报
回复
看来楼主需要搜索一下“键盘缓冲区”的概念
zaixiankaifa 2018-03-17
  • 打赏
  • 举报
回复
引用 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打印,最后才一次性打印五个字符. 红色这部分,是我比较疑惑的地方.
zaixiankaifa 2018-03-17
  • 打赏
  • 举报
回复
引用 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'再打印?
赵4老师 2018-03-17
  • 打赏
  • 举报
回复
'\r' ?
AlbertS 2018-03-17
  • 打赏
  • 举报
回复
引用 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的字母还会继续输出
AlbertS 2018-03-17
  • 打赏
  • 举报
回复
引用 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; 下面值分析这组结果:
赵4老师 2018-03-17
  • 打赏
  • 举报
回复
不要迷信书、考题、老师、回帖; 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧