假如程序中需要在屏幕上输入一个整型,scanf()函数,如下:scanf(“%d",&a);如果此时输入的是一个char型,结果会如何?
下面说一下scanf()的使用规则:
1、如果使用了字段宽度读取输入,那么scanf()在字段结尾或者在第一个空白字符处终止。如果第一个空白字符不是数字,比如使用%d读取整数,而输入A,则scanf()会停在那里,并把A放回输入,并没有把任何值赋给指定的变量,程序下一次读取输入时,它就在A处重新开始,如果程序中只有%d说明符,scanf()永远也不会越过那个A,而且,如果使用带有多个说明符的scanf()语句,函数会在第一个出错的地方停止读取输入。其他数字说明符读取输入与使用%d的情况相同。
2、scanf()的返回值:返回成功读取的项目的个数。如果没有读取任何项目,返回0.当它检测到文件结尾,返回EOF(EOF在头文件stdio.h中定义的特殊值,一般#define把EOF定义为-1.
3、除了%c以外的说明符会自动跳过输入项之前的空格。如果在格式字符串中%c之前有一个空格,那么scanf()将会跳到第一个非空白字符处。即,scanf(“%c”,&ch):读取在输入中遇到的第一个字符。而scanf(“ %c”,&ch):读取遇到的第一个非空白字符。
如何使用scanf()解决读入类型不一致的问题问题:
1)fgets(buf,sizeof(buf),stdin);将输入流stdin中的字符全部读取字符数组buf中,小于buf大小。
sscanf(buf,”%d”,&hoge);可避免输入流输入多余的字符影响后面流的输入与输出。读取buf
2)fflush(stdin):是对输出流使用的,他不能用于输入流标准中并没有定义用于输入流的fflush()
3)while(scanf(“%d”,&hoge)!= 1)
printf(“输入错误,请再次输入!”);会导致程序无限循环下去。
示例:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int input;
char ch;
while(scanf("%d",&input) != 1)
{
while((ch = getchar()) != '\n')
putchar(ch);
printf(" is not an integer.\nPlease enter an");
printf(" integer value, such an 23, -23, or 3:");
}
system("pause");
return 0;
}
如果输入的第一个非int型字符,则字符保留在输入流中,然后由第二个while循环依次打印出输入字符到屏幕上。以上代码解决了scanf()输入类型不符的问题。