Code Bye

这个while循环终止了却跳不出来为什么

#include<stdio.h>
main(){
	char a;
	scanf_s("%c", &a);
	while (a!= "@")
	{
		scanf_s("%c", &a);
		printf("kek ");
	}
	printf("oo ");
}

运行结果是循环能停止,但是跳不出来,不知道为什么。

解决方案

10

不要使用
while (条件)
更不要使用
while (组合条件)
要使用
while (1) {
 if (条件1) break;
 //...
 if (条件2) continue;
 //...
 if (条件3) return;
 //...
}
原因是前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。
典型如:
下面两段的语义都是当文件未结束时读字符
while (!feof(f)) {
 a=fgetc(f);
 //...
 b=fgetc(f);//可能此时已经feof了!
 //...
}
而这样写就没有问题:
while (1) {
 a=fgetc(f);
 if (feof(f)) break;
 //...
 b=fgetc(f);
 if (feof(f)) break;
 //...
}
相似的例子还可以举很多。

10

printf里面的%和变量的一一对应关系
scanf里面的%和变量以及变量前加不加&的一一对应关系
是C代码中非常容易出错的地方,而且通常编译还不出错。
所以在编译源代码之前值得专门仔细检查一遍甚至多遍。
在每个最后不带\n的printf后面加fflush(stdout);
在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin);
另外请检查scanf的返回值。
//请今后要用
char c;
scanf("%c",&c);
//时,都改为
char s[2];
char c;
scanf("%1s",s);
c=s[0];

10

scanf_s要指定每个对应“c”、“s”以及传说中的“[”格式的缓冲区的大小。
char c;
scanf_s("%c", &c, 1); // 思考题:为什么不用sizeof?
引用:
Quote: 引用:
//请今后要用
char c;
scanf("%c",&c);
//时,都改为
char s[2];
char c;
scanf("%1s",s);
c=s[0];

诶,这段代码没看懂,为什么啊?

本意是为了“吃”掉换行,和在之后加fflush(stdin)的做法相似(但fflush“吃”得更多)。
然而这“都”字散发着浓郁的经验主义(教条主义)的气息。

10

引用:

是原因是sizeof返回的是字节大小,所以不行?(一本正经的胡说八道)本人也不知道

这个系列要的“缓冲区大小”指的是“能容纳的字符个数”而不是“字节个数”。
窄字符版本要的是char的个数,宽字符版本要的是wchar_t的个数。
所以对于数组缓冲区(buf),直接sizeof(buf)是错误的;sizeof(buf)/sizeof(buf[0])、_countof(buf)之类才是正确的。
而对于单个字符的缓冲区,1个char c的大小就是1,1个wchar_t c的大小也是1;sizeof(c)一则多余,二则对于后者是错误的。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明这个while循环终止了却跳不出来为什么