c语言 scanf("%d",&a);输入字符为什么会进入死循环?
7个回答
展开全部
你这个问题可以利用scanf函数的返回值来解决,scanf函数的返回值是个整数,它的含义是输入和格式匹配的参数的个数,比如scanf("%d"%d",&a,&b);
如果输入
2
3,那就会返回2,输入2
a,返回1输入a
3
则返回0,一旦碰到格式不匹配的输入,就把不匹配的输入留在缓冲区并且拒绝读取,那么你这个例子的scanf("%d",&a);如果格式正确匹配的话会返回1,那就利用这一点来判断是否出现了不匹配的情况:
int b=2,a=0;
scanf("%d",&a);
while(a != b)
{
printf("you lose!!\n");
if(scanf("%d",&a)!=1) //如果不匹配
{
while(getchar()!='\n'){}; //清空输入缓冲,可能有字符串输入,所以用了循环
}
}
如果输入
2
3,那就会返回2,输入2
a,返回1输入a
3
则返回0,一旦碰到格式不匹配的输入,就把不匹配的输入留在缓冲区并且拒绝读取,那么你这个例子的scanf("%d",&a);如果格式正确匹配的话会返回1,那就利用这一点来判断是否出现了不匹配的情况:
int b=2,a=0;
scanf("%d",&a);
while(a != b)
{
printf("you lose!!\n");
if(scanf("%d",&a)!=1) //如果不匹配
{
while(getchar()!='\n'){}; //清空输入缓冲,可能有字符串输入,所以用了循环
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
研究过scanf函数是怎样接收整型数字的吗?它要跳过所有非数字的字符专接收数字。那么输入了字符它就一直留在输入缓冲区;只要缓冲区有字符,scanf就要去读,一读不是数字,它就跳过,试图等到输入缓冲区没有字符了才等待你输入……如此反复,当然就“死循环”了。为了验证,你在printf("you
lose!!\n");后加一句getchar();,把缓冲区里的那个非数字字符接收掉,看看还会不会是“死循环”?
lose!!\n");后加一句getchar();,把缓冲区里的那个非数字字符接收掉,看看还会不会是“死循环”?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1.
scanf("%d",&a);
应当键入数字,如果键入字母,scanf
语句执行失败,a当中未取得输入值,scanf函数返回0。
2.
不一定是死循环,根程功编制的能有关。
有些情况,是由于输入流里的你键入的字母没有被清掉,后面的输入语句连续执行失败。可以用
fflush(stdin);
清除多余的字符。
例程:
#include<stdio.h>
int main(){
int n=9;
scanf("%d",&n);
printf("%d\n",n);
fflush(stdin); // 清除
scanf("%d",&n);
printf("%d\n",n);
fflush(stdin); // 清除
scanf("%d",&n);
printf("%d\n",n);
return 0;
}
scanf("%d",&a);
应当键入数字,如果键入字母,scanf
语句执行失败,a当中未取得输入值,scanf函数返回0。
2.
不一定是死循环,根程功编制的能有关。
有些情况,是由于输入流里的你键入的字母没有被清掉,后面的输入语句连续执行失败。可以用
fflush(stdin);
清除多余的字符。
例程:
#include<stdio.h>
int main(){
int n=9;
scanf("%d",&n);
printf("%d\n",n);
fflush(stdin); // 清除
scanf("%d",&n);
printf("%d\n",n);
fflush(stdin); // 清除
scanf("%d",&n);
printf("%d\n",n);
return 0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
(本人手打原创,非复制)
scanf有缓存区,当输入非法字符(要求的类型与输入的类型不符合),scanf会直接跳过,该输入不会被接受也不会被清除,被存放在scanf的缓存区,当下次调入scanf函数时,会直接从缓存区读取非法字符,造成死循环。
解决思路:清除滞留在scanf缓存区的数据,使下一次循环时scanf可以正常的读取用户输入。
解决方法一:直接使用缓冲区清除函数 fflush(stdin); //stdin代表标准输入;
但 fflush(stdin) 这个方法只能保证在VC上可以生效,在其他编译器上不保证可以起作用。如果在Linux系统中使用gcc编译,该方法不可用。
解决方法二:用getchar把缓冲区清空。
while (getchar() != '\n'); //依次读取单个缓冲区数据(起到清空作用),直到遇到回车时结束,注意'\n'表示回车键,用的是单引号。
可以理解为用 getchar 抢先读取了缓冲区数据,这样缓冲区就没有数据了。
另外: scanf 函数返回一个整数,表示成功读入数据的变量个数。例如:
int i, S, m, a; //定义变量为整数,如果输入字符,则视为无效数字。不计入m的值。
m = scanf("%d",&S);
printf("%d \n",m); //如果输入的是数字,m=1。输入的是字符,m=0。连续数字或字符只会取第一个。
m = scanf("%d %d %d",&S, &i, &a);
printf("%d \n",m); //如果输入的三个结果都是有效数字,则m=3。连续数字只会取第一个数字。
因此:方法三:
m = scanf("%d",&S); //输入正确数字时,m返回1;输入不正确数字时,m返回0。
if (m != 1) break; //输入不正确数字时,退出循环体。
scanf有缓存区,当输入非法字符(要求的类型与输入的类型不符合),scanf会直接跳过,该输入不会被接受也不会被清除,被存放在scanf的缓存区,当下次调入scanf函数时,会直接从缓存区读取非法字符,造成死循环。
解决思路:清除滞留在scanf缓存区的数据,使下一次循环时scanf可以正常的读取用户输入。
解决方法一:直接使用缓冲区清除函数 fflush(stdin); //stdin代表标准输入;
但 fflush(stdin) 这个方法只能保证在VC上可以生效,在其他编译器上不保证可以起作用。如果在Linux系统中使用gcc编译,该方法不可用。
解决方法二:用getchar把缓冲区清空。
while (getchar() != '\n'); //依次读取单个缓冲区数据(起到清空作用),直到遇到回车时结束,注意'\n'表示回车键,用的是单引号。
可以理解为用 getchar 抢先读取了缓冲区数据,这样缓冲区就没有数据了。
另外: scanf 函数返回一个整数,表示成功读入数据的变量个数。例如:
int i, S, m, a; //定义变量为整数,如果输入字符,则视为无效数字。不计入m的值。
m = scanf("%d",&S);
printf("%d \n",m); //如果输入的是数字,m=1。输入的是字符,m=0。连续数字或字符只会取第一个。
m = scanf("%d %d %d",&S, &i, &a);
printf("%d \n",m); //如果输入的三个结果都是有效数字,则m=3。连续数字只会取第一个数字。
因此:方法三:
m = scanf("%d",&S); //输入正确数字时,m返回1;输入不正确数字时,m返回0。
if (m != 1) break; //输入不正确数字时,退出循环体。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询