读书人

关于scanf()的有关问题

发布时间: 2012-03-17 19:06:27 作者: rapoo

关于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); 这样后续的一些无用数据被处理掉

读书人网 >C语言

热点推荐