C语言基本教程(三)输入输出函数及节制流程语句(4)
二、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);
}