(1)在高版本的 Visual Studio 编译器中,scanf 被认为是不安全的,被弃用,应当使用scanf_s代替 scanf。(2) 对于字符串数组或字符串指针变量,由于数组名可以转换为数组和指针变量名本身就是地址,因此使用scanf()函数时,不需要在它们前面加上"&"操作符。(3) 可以在格式化字符串中的"%"各格式化规定符之间加入一个整数,表示任何读操作中的最大位数。(4) scanf函数中没有类似printf的精度控制。如: scanf("%5.2f",&a); 是非法的。不能企图用此语句输入小数为2位的实数。(5) scanf中要求给出变量地址,如给出变量名则会出错如 scanf("%d",a);是非法的,应改为scanf("%d",&a);才是合法的。(6) 在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔,则可用空格,TAB或回车作间隔。C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12A”时,A即为非法数据)时即认为该数据结束。(7) 在输入字符数据(%c)时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符。例如:输入为:则把'd'赋予a, ' '(空格)赋予b,'e'赋予c。因为%c 只要求读入一个字符,后面不需要用空格作为两个字符的间隔,因此把' '作为下一个字符送给b。只有当输入为:def(字符间无空格) 时,才能把'd'赋于a,'e'赋予b,'f'赋予c。 如果在格式控制中加入空格作为间隔,如则输入时各数据之间可加空格。我们用一些例子来说明一些规则:由于scanf函数"%c%c"中没有空格,输入M N,结果输出只有M。而输入改为MN时则可输出MN两字符,见下面的输入运行情况: input character a,b输入:屏幕显示:本例表示scanf格式控制串"%c %c"之间有空格时, 输入的数据之间可以有空格间隔。(8) 如果格式控制串中有非格式字符则输入时也要输入该非格式字符。例如:其中用非格式符“ , ”作间隔符,故输入时应为:又如:则输入应为如输入的数据与输出的类型不一致时,虽然编译能够通过,但结果将不正确。由于输入数据类型为整型, 而输出语句的格式串中说明为长整型,因此输出结果和输入数据不符。输出并不是输入的值。如将scanf("%d",&a); 语句改为 scanf("%ld",&a);输入数据为长整型,输入输出数据才相等。如何让scanf()函数正确接受有空格的字符串?如: I love you!输入:输出:上述程序并不能达到预期目的。因为scanf扫描到"I"后面的空格就认为对str的扫描结束(空格没有被扫描),并忽略后面的" love you!"。值得注意的是,我们改动一下上面的程序来验证一下:输入:输出:好了,原因知道了,所以结论是:残留的信息 love you是存在于stdin流中,而不是在键盘缓冲区中。那么scanf()函数能不能完成这个任务?回答是:能!别忘了scanf()函数还有一个 %[] 格式控制符(如果对%[]不了解的请查看本文的上篇),请看下面的程序:键盘缓冲区残余信息问题scanf("%c", &c);这句不能正常接收字符,什么原因呢?我们用printf("c = %d\n", c);将C用int表示出来,启用printf("c = %d\n", c);这一句,看看scanf()函数赋给C到底是什么,结果是c=10 ,ASCII值为10是什么?换行即\n.对了,我们每击打一下"Enter"键,向键盘缓冲区发去一个“回车”(\r),一个“换行"(\n),在这里\r被scanf()函数处理掉了(姑且这么认为吧^_^),而\n被scanf()函数“错误”地赋给了c.解决办法:可以在两个scanf()函数之后加getchar(),但是要视具体scanf()语句加那个,这里就不分析了,读者自己去摸索吧。这里再给一个用“空格符”来处理缓冲区残余信息的示例:版本1:运行出错的程序版本2:使用了空格控制符后接着,我们运行看看,首先,运行第一个版本(错误的程序)我们输入:0 1 2 3 4 5 6 7 8 9结果是一个空字符再运行第二个版本(正确的程序)同样输入:0 1 2 3 4 5 6 7 8 9这一次就显示字符9,故此程序正确。那么为什么第二个程序就正确呢,原因何在,在%前面加一个空格就这么有用,答案是肯定的,就是%前面的空格在起作用,读者看看此文章的前面部分,在scanf的使用过程中应注意的问题中已经指出:“scanf()的格式控制串可以使用空白字符或其它非空白字符,使用空白字符会使scanf()函数在读操作中略去输入中的零个或多个空白字符。”所以在%前面加上了空格(空格属于空白字符,此外还有像制表符等也属于空白字符),在输入过程中,将略去输入中的一个或多个空白字符,所以我们输入的0 1 2 3 4 5 6 7 8 9这些字符中的空白字符就被略去了,字符9也就正确的打印出来了,这样子解释,相信大家都看明白勒吧!