scanf() 函数是 C 语言中一个非常重要的标准输入函数, ⽤于读取⽤⼾的键盘输⼊。程序运⾏到这个语句时,会停下来,等待⽤⼾从键盘输⼊。 ⽤⼾输⼊数据、按下回⻋键后, scanf() 就会处理⽤⼾的输⼊,将其存⼊变量。 它的原型定义在头⽂件 stdio.h 。
上⾯⽰例中, scanf() 的第⼀个参数 %d ,表⽰⽤⼾输⼊的应该是⼀个整数。 %d 就是⼀个占位 符, % 是占位符的标志, d 表⽰整数。第⼆个参数 &a表⽰,将⽤⼾从键盘输⼊的整数存⼊变量 a 。因为scanf() 传递的不是值,⽽是地址 。如果这⾥的变量是指针变量(⽐如字符串变量),那就不⽤加 & 运算符。
下⾯是⼀次将键盘输⼊读⼊多个变量的例⼦。
scanf() 处理数值占位符时,会⾃动过滤空⽩字符,包括空格、制表符、换⾏符等。 所以,⽤⼾输⼊的数据之间,有⼀个或多个空格不影响 scanf() 解读数据。
\n 在 scanf 里的真正含义
在 scanf 的格式字符串(如 "%f\n")中,\n 并不表示“等待用户输入换行”,而是表示:“跳过所有连续的空白字符(包括空格、Tab、换行符等),直到遇到一个非空白字符”。
举例说明:
scanf("%f\n", &ac); // 注意这里的 \n
你输入 3.6 并按 回车,此时:
%f 会读取 3.6,但 \n 会让 scanf 继续等待,因为它要跳过所有空白(包括你刚输入的回车)。
你必须再输入一个非空白字符(如随便按一个数字或字母),scanf 才会结束。
这显然不符合直觉!
如何正确使用 scanf 读取浮点数?
方法 1:直接去掉 \n(推荐)
scanf("%f", &ac); // 正确:读取浮点数后,遇到回车或空格就结束
此时输入 3.6 并按回车,程序会立即处理,不会等待额外输入。
方法 2:明确匹配换行符(不推荐)
如果你想严格匹配“浮点数 + 换行”,可以这样写:
scanf("%f%*c", &a); // %*c 读取并丢弃一个字符(如换行符)
但这种方法仍然不够健壮(比如用户输入 3.6 空格 也会出问题),所以推荐直接去掉 \n。
而在 printf 中,\n 是正常的换行符,例如:
printf("%d\n", ac); // 输出整数后换行
这里的 \n 就是字面意思,表示“换行”,不会导致任何问题。