二、scanf()函数
scanf()函数是格式化输入函数,它从标准输入设备(键盘)读取输入的信息。其调用格式为:
scanf("<格式化字符串>", <地址表>);
格式化字符串包括以下三类不同的字符;
1. 格式化说明符:格式化说明符与printf()函数中的格式说明符基本相同。
2. 空白字符: 空白字符会使scanf()函数在读操作中略去输入中的一个或多个空白字符。
3. 非空白字符: 一个非空白字符会使scanf()函数在读入时剔除掉与这个非空白字符相同的字符。
地址表是需要读入的所有变量的地址,而不是变量本身。这与printf()函数完全不同,要特别注意。各个变量的地址之间同","分开。
例2:
main()
{
int i, j;
printf("i, j=?\n");
scanf("%d, %d", &i, &j);
}
上例中的scanf()函数先读一个整型数,然后把接着输入的逗号剔除掉,最后读入另一个整型数。如果","这一特定字符没有找到, scanf()函数就终止。若参数之间的分隔符为空格,则参数之间必须输入一个或多个空格。
说明:
(1).对于字符串数组或字符串指针变量,由于数组名和指针变量名本身就是地址,因此使用scanf()函数时,不需要在它们前面加上"&"操作符。
例3
mian()
{
char *p, str[20];
scanf("%s", p); /*从健盘输入字符串*/
scanf("%s", str);
printf("%s\n", p); /*向屏幕输出字符串*/
printf("%s\n", str);
}
(2).可以在格式化字符串中的"%"各格式化规定符之间加入一个整数,表示任何读操作中的最大位数。
如例3中若规定只能输入10字符给字符串指针p,则第一条scanf()函数语句变为scanf("%10s", p);
程序运行时一旦输入字符个数大于10,p就不再继续读入,而后面的一个读入函数即scanf("%s", str)就会从第11个字符开始读入。
实际使用scanf()函数时存在一个问题,下面举例进行说明:
当使用多个scanf()函数连续给多个字符变量输入时, 例如:
main()
{
char c1, c2;
scanf("%c", &c1);
scanf("%c", &c2);
printf("c1 is %c, c2 is %c", c2\1, c2);
}
运行该程序,输入一个字符A后回车(要完成输入必须回车),在执行scanf("%c", &c1)时,给变量c1赋值"A",但回车符仍然留在缓冲区内,执行输入语句scanf("%c", &c2)时,变量c2输出的是一空行,如果输入AB后回车,那么输出结果为: c1 is A, c2 is B。
要解决以上问题,可以在输入函数前加入清除函数fflush()(这个函数的使用方法将在本节最后讲述)。修改以上程序变成:
#include<stdio.h>
main()
{
char c1, c2;
scanf("%c", &c1);
fflush(stdin);
scanf("%c", &c2);
printf("c1 is %c, c2 is %c", c1, c2);
}