scanf()函数输入的数据类型不一致的总是
大家好!我有一个问题需要朋友们帮助解决一下
如果从键盘上输入的数据类型和SCANF()中的格式控制列表中的类型不一致,会出现什么样的情况?
例如:
int a=1;
scanf( "%d ",&a);
如果上面的程序运行时,我从键盘上按下了一下字母(比如S),那么它将如何处理?变量a的值会怎么样?
问题来源是下面的程序无法得到预期的效果
#include <stdio.h>
void main()
{
int a=1;
while (a==1)
{
printf ( "%d\n ",a);
scanf( "%d ",&a);
}
}
此程度在运行过程中,如果按下的是键盘上的数字键则可以正常运行,但如果输入的是字母,则程序会自己无限制的重复执行WHILE循环体内的printf ( "%d\n ",a); 而不会再停下来等待输入数据.这是为什么?
******************************************************
感谢所有帮助我的人!
[解决办法]
scanf()函数接收输入数据时,遇以下情况结束一个数据的输入:(不是结束该scanf函数,scanf函数仅在每一个数据域均有数据,并按回车后结束)。
① 遇空格、“回车”、“跳格”键。
② 遇宽度结束。
③ 遇非法输入。
[解决办法]
你的问题在这个部分:
3.scanf()函数的参数输入类型不匹配问题
这是我在csdn论坛上见到的问题,这个错误有时候会让人莫名其妙。
#include <stdio.h>
main()
{
int a=123;
char c= 't ';
printf( "input\n ");
scanf( "%d%c ",&a,&c);
scanf( "%d%c ",&a,&c);
scanf( "%d%c ",&a,&c);
printf( "%d\n%c\n ",a,c);
return 0;
}
当输入a 回车 后,会直接跳过下面2个scanf语句,直接输出为
123
t
原因:对于scanf( "%d%c ",&a,&c),scanf语句执行时,首先试图从缓冲区中读入一个%d类型的数据,如果和
第一个参数匹配,则继续从缓冲区中读取数据和第二个参数进行匹配,依次进行下去,直到匹配完所有的参
数;如果其中有一个参数不匹配,那就从这个地方跳出,忽略这个scanf后面所有的参数,而去执行下一条语
句。
可以用下面的程序验证一下:
#include <stdio.h>
int main()
{
int a=123,b=1;
char c= 't ';
scanf( "%d%d ",&a,&b);
scanf( "%c ",&c);
printf( "%d\n%d\n%c\n ",a,b,c);
return 0;
}输入:2 回车a 回车
结果是:
2
1
a
解决方法:scanf()函数执行成功时的返回值是成功读取的变量数,也就是说,你这个scanf()函数有几个变量
,如果scanf()函数全部正常读取,它就返回几。但这里还要注意另一个问题,如果输入了非法数据,键盘缓
冲区就可能还个有残余信息问题。
比如:
#include <stdio.h>
main()
{
int a=123,b;
while(scanf( "%d%d ",&a,&b)!=2)
fflush(stdin);
printf( "%d\n%d\n ",a,b);
return 0;
}
你可以试一下,如果输入不是数字时,会有什么反应。
当然其他一些问题、技巧,
楼主也可以好好看看 ~
[解决办法]
jixingzhong(瞌睡虫星辰)大哥的代码有一点不对:2.缓冲区问题
这是一个非常容易错的地方,我就错过多次。
#include <stdio.h>
main()
{
int n = 5;
char c[n];//不能用变量来定义数组
for(int i = 0; i < n; i++)
c[i] = scanf( "%c ",&c[i]);
printf(c);
return 0;
}
#include <stdio.h>
main()
{
char c[5];
gets(c);
printf(c);
return 0;
}
这个程序,多输入几位也不会错误,在TC20和VC6中都没发现问题