user-0 提问: 这个while循环终止了却跳不出来为什么

回复:
user: user-1
content: 引用 15 楼 aimasa 的回复:是因为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)一则多余，二则对于后者是错误的。

user: user-2
content: 你可以选择用if语句来循环

user: user-3
content: 听说fflush(stdin)在Linux下不灵。

user: user-0
content: 引用 14 楼 idzeta的回复:scanf_s要指定每个对应“c”、“s”以及传说中的“[”格式的缓冲区的大小。  char c; scanf_s("%c", &c, 1); // 思考题：为什么不用sizeof？ [quote=引用 13 楼 aimasa 的回复:] [quote=引用 12 楼 赵4老师的回复:] //请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0]; 诶，这段代码没看懂，为什么啊？[/quote] 本意是为了“吃”掉换行,和在之后加fflush(stdin)的做法类似（但fflush“吃”得更多）。 然而这“都”字散发着浓郁的经验主义（教条主义）的气息。 [/quote] 是因为sizeof返回的是字节大小，所以不行？（一本正经的胡说八道）我也不知道

user: user-1
content: scanf_s要指定每个对应“c”、“s”以及传说中的“[”格式的缓冲区的大小。  char c; scanf_s("%c", &c, 1); // 思考题：为什么不用sizeof？ 引用 13 楼 aimasa 的回复:[quote=引用 12 楼 赵4老师的回复:] //请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0]; 诶，这段代码没看懂，为什么啊？[/quote] 本意是为了“吃”掉换行,和在之后加fflush(stdin)的做法类似（但fflush“吃”得更多）。 然而这“都”字散发着浓郁的经验主义（教条主义）的气息。

user: user-0
content: 引用 12 楼 赵4老师的回复: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]; 诶，这段代码没看懂，为什么啊？

user: user-3
content: 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];

user: user-0
content: 引用 8 楼 赵4老师的回复:不要使用 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;  //... } 类似的例子还可以举很多。  所以第三种方法是更精确一点吗，我好像懂了点，谢谢啦

user: user-0
content: 引用 7 楼 lilimite的回复:我感觉还是缓存的问题，char型是占一个字节的，每次输入之后的回车键缓存在里面会被下次的scanf直接扫描，我用的是vc， #include<stdio.h> main(){     char a;     scanf("%c", &a); fflush(stdin);     while (a!= '@')     { 		 printf("kek \n");         scanf("%c", &a); 		fflush(stdin);      }     printf("oo "); }  可以用F10单步看一看每一次输入之后a的值变化 诶，我一会去看看，谢谢你啦

user: user-0
content: 引用 9 楼 aimasa的回复:[quote=引用 7 楼 lilimite的回复:]我感觉还是缓存的问题，char型是占一个字节的，每次输入之后的回车键缓存在里面会被下次的scanf直接扫描，我用的是vc， #include<stdio.h> main(){     char a;     scanf("%c", &a); fflush(stdin);     while (a!= '@')     { 		 printf("kek \n");         scanf("%c", &a); 		fflush(stdin);      }     printf("oo "); }  可以用F10单步看一看每一次输入之后a的值变化 诶，我一会去看看，谢谢你啦[/quote] 奥难道是软件的问题，我用的是visual studio ，这样输入以后连kak都不出来了

user: user-3
content: 不要使用 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;  //... } 类似的例子还可以举很多。

user: user-4
content: 我感觉还是缓存的问题，char型是占一个字节的，每次输入之后的回车键缓存在里面会被下次的scanf直接扫描，我用的是vc， #include<stdio.h> main(){     char a;     scanf("%c", &a); fflush(stdin);     while (a!= '@')     { 		 printf("kek \n");         scanf("%c", &a); 		fflush(stdin);      }     printf("oo "); }  可以用F10单步看一看每一次输入之后a的值变化

user: user-0
content: 引用 5 楼 自信男孩的回复:[quote=引用 2 楼 aimasa 的回复:] 我试了，可是还是不行，它就是跳不出循环 你是如何输入的？ 说一下你的尝试样例[/quote] 我输入是123@，输出是     kak    然后……运行到这里，就停止运行了

user: user-5
content: 引用 2 楼 aimasa 的回复:我试了，可是还是不行，它就是跳不出循环 你是如何输入的？ 说一下你的尝试样例

user: user-6
content: 增加fflush(stdin)清除缓存即可，或者用getchar（）也行 #include<stdio.h> #include<stdlib.h> main(){     char a;     scanf_s("%c", &a); 	fflush(stdin);     while (a!= '@')     {          printf("请重新输入： "); 		scanf_s("%c", &a); 		fflush(stdin);         printf("kek ");     }     printf("oo "); }

user: user-0
content: 引用 1 楼 自信男孩的回复:#include<stdio.h>  int main() {     char a;     scanf_s("%c", &a);     getchar();     while (a != '@')     {         scanf_s("%c", &a);         getchar();         printf("kek ");     }     printf("oo "); } while判断条件是输入@字符才能退出循环； 另外，为了避免多次循环，加一句getchar 我试了，可是它还是跳不出循环

user: user-0
content: 我试了，可是还是不行，它就是跳不出循环

user: user-5
content: #include<stdio.h>  int main() {     char a;     scanf_s("%c", &a);     getchar();     while (a != '@')     {         scanf_s("%c", &a);         getchar();         printf("kek ");     }     printf("oo "); } while判断条件是输入@字符才能退出循环； 另外，为了避免多次循环，加一句getchar