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

噜噜噜噜噜噜 2017-03-12 07:43:25
#include<stdio.h>
main(){
char a;
scanf_s("%c", &a);
while (a!= '@')
{
scanf_s("%c", &a);
printf("kek ");
}
printf("oo ");
}

运行结果是循环能停止,但是跳不出来,不知道为什么。
...全文
560 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
idzeta 2017-03-24
  • 打赏
  • 举报
回复
引用 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)一则多余,二则对于后者是错误的。
我想.. 2017-03-24
  • 打赏
  • 举报
回复
你可以选择用if语句来循环
赵4老师 2017-03-17
  • 打赏
  • 举报
回复
听说fflush(stdin)在Linux下不灵。
噜噜噜噜噜噜 2017-03-17
  • 打赏
  • 举报
回复
引用 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返回的是字节大小,所以不行?(一本正经的胡说八道)我也不知道
idzeta 2017-03-16
  • 打赏
  • 举报
回复
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“吃”得更多)。 然而这“都”字散发着浓郁的经验主义(教条主义)的气息。
噜噜噜噜噜噜 2017-03-15
  • 打赏
  • 举报
回复
引用 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];
诶,这段代码没看懂,为什么啊?
赵4老师 2017-03-15
  • 打赏
  • 举报
回复
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];
噜噜噜噜噜噜 2017-03-14
  • 打赏
  • 举报
回复
引用 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;
 //...
}
类似的例子还可以举很多。
所以第三种方法是更精确一点吗,我好像懂了点,谢谢啦
噜噜噜噜噜噜 2017-03-14
  • 打赏
  • 举报
回复
引用 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的值变化
诶,我一会去看看,谢谢你啦
噜噜噜噜噜噜 2017-03-14
  • 打赏
  • 举报
回复
引用 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都不出来了
赵4老师 2017-03-13
  • 打赏
  • 举报
回复
不要使用
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;
 //...
}
类似的例子还可以举很多。
lilimite 2017-03-13
  • 打赏
  • 举报
回复
我感觉还是缓存的问题,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的值变化
噜噜噜噜噜噜 2017-03-13
  • 打赏
  • 举报
回复
引用 5 楼 自信男孩的回复:
[quote=引用 2 楼 aimasa 的回复:] 我试了,可是还是不行,它就是跳不出循环
你是如何输入的? 说一下你的尝试样例[/quote] 我输入是123@,输出是 kak 然后……运行到这里,就停止运行了
自信男孩 2017-03-12
  • 打赏
  • 举报
回复
引用 2 楼 aimasa 的回复:
我试了,可是还是不行,它就是跳不出循环
你是如何输入的? 说一下你的尝试样例
幽兰星梦 2017-03-12
  • 打赏
  • 举报
回复
增加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 ");
}
噜噜噜噜噜噜 2017-03-12
  • 打赏
  • 举报
回复
引用 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
我试了,可是它还是跳不出循环
噜噜噜噜噜噜 2017-03-12
  • 打赏
  • 举报
回复
我试了,可是还是不行,它就是跳不出循环
自信男孩 2017-03-12
  • 打赏
  • 举报
回复
#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

69,371

社区成员

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

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