scanf 的 长度修饰符 和 转换说明符 与 printf 几乎相同。主要的区别如下:
长度修饰符 :(可选项)对于 float 与 double 类型,printf() 的转换说明都用 f
; 而对于 scanf() ,float 保持不变,double 要在 f 前加长度修饰符 l ,即:lf
。
例 1
#include<stdio.h>
int main(void) {
double a = 3.0;
double b;
scanf("%lf", &b); // 把键盘输入的数字赋值给a
printf("%lf\n", a);
printf("%lf", b);
return 0;
}
15
3.000000
15.000000
scanf 函数遵循什么规则来识别整数或浮点数呢?
在要读入整数时,scanf 函数首先会寻找正号或负号,然后从读入一个数字开始直到读入一个非数字为止。
当要求读入浮点数时,scanf 函数首先会寻找正号或负号(可选),然后是一串数字(可能含有小数点),再后是一个指数(可选)。指数由一个字母e,可选的符号,一个或多个数字组成。
当 scanf 函数遇到一个不可能输入当前项的字符时,它会把此字符“放回原处”,以便在扫描下一项或下一次调用 scanf 时再次读入。
易混淆的 printf() 与 scanf()
-
printf("%d", &i);
输出的并不是 i 的值 (而是 i 的地址的十进制数值)
-
scanf("%d, %d", &i, &j);
scanf 在第一个 %d 读入一个整数后,试图把逗号与输入流中的下一个字符相匹配,如果这个字符不是
,
,那 scanf 就会终操作,而不再读取变量 j 的值。 -
scanf("%d\n", &i);
printf 函数中经常有
\n
,但是如果在 scanf 格式串结尾放一个 \n 通常会引发你预期之外的问题。对于 scanf 函数来说,\n 等同于空格,那么 scanf 就会在流中寻找空白字符,但是我们上面说过,scanf 格式串中的空白字符会与 输入流中的零个或多个空白字符匹配。所以当你输入完成后按下回车,这个回车会与 scanf 中的 \n 匹配,之后你无论打多少回车都不会使 scanf 结束,除非你输入一个非空字符,使 scanf 因匹配失败而退出。