对于该函数,我觉得需要紧记的是:
1) 在输入流中,字符只能由空白字符(包括空格、换行符、制表符)分割,不能由分号、逗号分割。
2) 控制串中的空白符使 scanf() 在输入流中跳过一个或多个空白行,本质上,控制串中的空白符使 scanf() 在输入流中读,但不保存结果,直到发现非空白字符为止。
3) 非空白符使 scanf() 在流中读一个匹配的字符并忽略之。例如, "%d,%d " 使 scanf() 先读入一个整数 ,读入中放弃逗号,然后读另一个整数。如未发现匹配,scanf() 返回。
下面通过例子,我们来好好理解一下上面那些话。
例1:
#include <stdio.h>
main()
{
int a=0,b=0;
printf( "input the data\n ");
scanf("%d%d",&a,&b);
printf("a=%d,b=%d",a,b);
return 0;
}
输入3,5 输出a=3,b=0
b没有改变吧,因为逗号不是分隔符,遇到逗号scanf()就返回了,不信,我们运行下面一个程序看看。
例2:
#include <stdio.h>
main()
{
int a=0,b=0;
printf( "input the data\n");
printf("%d",scanf("%d%d",&a,&b));
return 0;
}
输入5,3,输出1
知道为什么吗?没错,scanf()函数的返回值就是得到的输入变量的个数,由于输入逗号之后它就返回了,所以只有a是有改变的。
下面看例子3:
#include <stdio.h>
int main()
{
int i;
char j[10];
for(i = 0;i <10;i++)
{
scanf("%c",&j[i]);/*这里%前没有空格*/
}
printf("the result is :\n%s",j);//输出该数组
}
}
输入a~e且输完每个字符后面都直接回车,到输入e回车就开始打印结果了,因为每个回车都被算成了输入字符。(出现烫字是因为数组用数组最后没指定结束符,以至于继续往后读字符,VC编译器对于没有初始化的局部变量插入代码,使之初值为0xcccc,即中文烫字。
但是如果在%c前面加一个空格,就使得scanf函数跳过输入流中的空白行直到非空白字符如下程序就可以正确显示结果:
#include <stdio.h>
int main()
{
int i;
char j[10];
for(i = 0;i <10;i++)
{
scanf(" %c",&j[i]);/*这里%前有空格*/
}
printf("%s",j);//输出该数组
}
}
更多详细解释参考http://blog.csdn.net/21aspnet/article/details/174326