关于scanf()的问题
我写了这样一段程序:
#include <stdio.h>
#include <stdlib.h>
main()
{
int x_ctoi;
char x= 'a ';
int y=0;
printf( "\n\n ");
printf( "\n\n输入q,0退出 ");
while(1)
{
printf( "\n\n请输入(先输入横坐标a-z再输入纵坐标1-15,以逗号分隔): ");
scanf( "%c,%d ",&x,&y);
if(x== 'q ')
break;
x_ctoi=(int)x;
if(x_ctoi <65||(x_ctoi> 79&&x_ctoi <97)||x_ctoi> 111||y <=0||y> 15)
{
if(x_ctoi==113)
break;
printf( "\n\n输入错误请重新输入\n ");
continue;
}
}
}
取文件名为:scanf_test.c
在linux下编译
cc scanf_test.c -o scanf_test
顺利通过
运行:
./scanf_test
第一次输入:n,0 结果如下:
输入q,0退出
请输入(先输入横坐标a-z再输入纵坐标1-15,以逗号分隔):n,0
输入错误请重新输入
请输入(先输入横坐标a-z再输入纵坐标1-15,以逗号分隔):
这正是我要的结果,但是再输入:m,0 结果如下:
请输入(先输入横坐标a-z再输入纵坐标1-15,以逗号分隔):m,0
输入错误请重新输入
请输入(先输入横坐标a-z再输入纵坐标1-15,以逗号分隔):
输入错误请重新输入
请输入(先输入横坐标a-z再输入纵坐标1-15,以逗号分隔):
我用GDB进行了单步调试结果是在第二次输入后continue后在scanf( "%c,%d ",&x,&y);处程序没有中断等待我输入信息而是直接就过去了当再次continue后才在scanf( "%c,%d ",&x,&y);处停下等待我输入信息 因此才产生了如上所述的结果
我想知道为什么会这样?
为什么第一次continue后不能在scanf()处停下而要等再次continue后才能停住?
请指教!!!不胜感激!!!
[解决办法]
可能是输入字符的时候会把回车也默认为输入加到缓存中,所以再次输入的时候实际上已经是输入了回车,只有第三次才回让你继续输入,可以加个语句刷下缓存就可以了
[解决办法]
#include <stdio.h>
#include <stdlib.h>
void main()
{
char x = 'a ';
int y =0 ;
printf( "\n\n ");
printf( "\n\n输入q,0退出 ");
while(1)
{
printf( "\n\n请输入(先输入横坐标a-z再输入纵坐标1-15,以逗号分隔): ");
scanf( "%c,%d ",&x,&y);
getchar();
if(x== 'q ')
break;
if (( x > = 'a ' && x <= 'z ') || ( x > = 'A ' && x <= 'Z '))
{
//....
}
else
{
printf( "\n\n输入错误请重新输入\n ");
continue;
}
}
}
[解决办法]
1.scanf( "%c,%d ",&x,&y);
fflush(stdin);
2.scanf( "%c,%d ",&x,&y);
getchar();
[解决办法]
%c 获取的是有这个讨厌的问题
最后的一个回车信息还在缓存中处理掉
我一般在scanf处理格式化数据,经常遇到返回错误情况
使用一个局部数组在scanf后gets(dump); 这样后续的一些无用数据被处理掉