回复 3楼 linlulu001
使用scanf注意的几点:
(1) 对于字符串数组或字符串指针变量,由于数组名和指针变量名本身就是地址,因此使用scanf()函数时,不需要在它们前面加上"&"操作符。
(2) 可以在格式化字符串中的"%"各格式化规定符之间加入一个整数,表示任何读操作中的最大位数。
(3) scanf函数中没有类似printf的精度控制。
如: scanf("%5.2f",&a); 是非法的。不能企图用此语句输入小数为2位的实数。
(4) scanf中要求给出变量地址,如给出变量名则会出错
如 scanf("%d",a);是非法的,应改为scanf("%d",&a);才是合法的。
(5) 在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔,则可用空格,TAB或回车作间隔。
C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12A”时,A即为非法数据)时即认为该数据结束。
(6) 在输入字符数据(%c)时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符。
例如:
1、scanf("%c%c%c",&a,&b,&c);
输入为:d e f
则把'd'赋予a, ' '(空格)赋予b,'e'赋予c。因为%c 只要求读入一个字符,后面不需要用空格作为两个字符的间隔,因此把' '作为下一个字符送给b。
只有当输入为:def(字符间无空格) 时,才能把'd'赋于a,'e'赋予b,'f'赋予c。 如果在格式控制中加入空格作为间隔,
2、scanf("%c %c %c",&a,&b,&c);
则输入时各数据之间可加空格。
(7) 如果格式控制串中有非格式字符则输入时也要输入该非格式字符。
1、scanf("%d,%d,%d",&a,&b,&c);
其中用非格式符“ , ”作间隔符,故输入时应为:5,6,7
2、scanf("a=%d,b=%d,c=%d",&a,&b,&c);
则输入应为:a=5,b=6,c=7
如输入的数据与输出的类型不一致时,虽然编译能够通过,但结果将不正确。
例如:float a; scanf("%d",&a);
键盘缓冲区残余信息问题
#include<stdio.h>
int main(void)
{
int a;
char c;
while(c!='N')
{
canf("%d",&a);
scanf("%c",&c);
printf("a=%dc=%c\n",a,c);/*printf("c=%d\n",c);*/
}
return 0;
}
scanf("%c", &c);这句不能正常接收字符,什么原因呢?用printf("c = %d\n", c);将C用int表示出来,看看scanf()函数赋给C到底是什么,结果是c=10 ,ASCII值为10是 换行即\n。向键盘缓冲区发去一个“回车”(\r),一个“换行"(\n),在这里\r被scanf()函数处理掉了,而\n被scanf() 函数“错误”地赋给了c。(这样理解有助记忆)。
特别说明:\r是回车符,\n是换行符。Unix 系统里,每行结尾只有“<换行>”,即“\n”;Windows系统里面,每行结尾是“<回车><换行>”,即“ \r\n”;Mac系统里,每行结尾 是“<回车>”。
解决办法:
1、可以在两个scanf()函数之后加getch(), getchar(),但是要视具体scanf()语句加那个,这里就不分析,自己去摸索。
2、可以用scanf("%*[^\n]");来清空缓冲区,这里要注意的是它会保留下“\n”。再加上scanf("%*c");这句,读取保留下来的\n。
3、也可以使用一些清空输入流的函数来清空缓冲区里的数据,避免这些数据对程序的影响。如:fflush(stdin)