如样例代码printf("BMI = %f\n", 21.3),其中%f就是一个占位符。printf()函数的占位符有许多种类,与c语言的数据类型相对应。以下列举一些常见的。
| 占位符 | 含义 |
|---|---|
| %a | 十六进制浮点数,字母输出为小写。 |
| %A | 十六进制浮点数,字母输出为大写。 |
| %c | 字符。//char |
| %d | 十进制整数。// int |
| %e | 使用科学计数法的浮点数,指数部分的e为小写。 |
| %E | 使用科学计数法的浮点数,指数部分的E为大写。 |
| %i | 整数,基本等同于%d。 |
| %f | 小数(包含float类型和double类型)。//float %f double %lf |
| %g | 6个有效数字的浮点数。整数部分一旦超过6位,就会自动转为科学计数法,指数部分的e为小写。 |
| %G | 等同于%g,唯一的区别是指数部分的E为大写。 |
| %hd | 十进制 short int 类型。 |
| %ho | 八进制 short int类型。 |
| %hx | 十六进制 short int类型。 |
| %hu | unsigned short int 类型。 |
| %ld | 十进制 long int 类型。 |
| %lo | 八进制long int 类型。 |
| %lx | 十六进制 long int 类型。 |
| %lu | unsigned long int 类型。 |
| %lld | 十进制long long int 类型。 |
| %llo | 八进制 long long int类型。 |
| %llx | 十六进制 long long int类型。 |
| %llu | unsigned long long int 类型。 |
| %Le | 科学计数法表示的long double类型浮点数。 |
| %Lf | long double类型浮点数。 |
| %n | 已输出的字符串数量。该占位符本身不输出,只将值存储在指定变量之中。 |
| %o | 八进制整数。 |
| %p | 指针(用来打印地址)。 |
| %s | 字符串。 |
| %u | 无符号整数(unsigned int)。 |
| %x | 十六进制整数。 |
| %zd | size_t类型。//sizeof操作符的返回值类型 |
| %% | 输出一个百分号。 |
scanf()常用的占位符如下,与printf()的占位符基本一致。
| 占位符 | 含义 |
|---|---|
| %c | 字符。 |
| %d | 整数。 |
| %f | float类型浮点数。 |
| %lf | double类型浮点数。 |
| %Lf | long double类型浮点数。 |
| %s | 字符串。 |
| %[] | 在方括号中指定一组匹配的字符(比如%[0-9]),遇到不在集合之中的字符,匹配将会停止。 |
值得注意的是,上面所有占位符之中,除了%c以外,都会自动忽略起首的空白字符。%c不忽略空白字符,总是返回当前第一个字符,无论该字符是否为空格。
如果要强制跳过字符前的空白字符,可以写成scanf(" %c",&ch),即%c前加上一个空格,表示跳过零个或多个空白字符。
下面要特别说一下占位符%s ,它其实不能简单地等同于字符串。它的规则是,从当前第一个非空白字符开始读起,直到遇到空白字符(即空格、换行符、制表符等)为止。
因为%s不会包含空白字符,所以无法用来读取多个单词,除非多个%s一起使用。这也意味着,scanf()不适合读取可能包含空格的字符串,比如书名或歌曲名。另外,scanf()遇到%s占位符,会在字符串变量末尾存储一个空字符\0。
scanf()将字符串读入字符数组时,不会检测字符串是否超过了数组长度。所以,储存字符串时, 很可能会超过数组的边界,导致预想不到的结果。为了防止这种情况,使用%s占位符时,应该指定读入字符串的最长长度,即写成%[m]s ,其中的[m]是一个整数,表示读取字符串的最大长度,后面的字符将被丢弃。
#include <stdio.h>
int main()
{
char name[11];
scanf("%10s", name);
return 0;
}
上面示例中,name是一个长度为11的字符数组,scanf()的占位符%10s表示最多读取用户输入的10个字符,后面的字符将被丢弃,这样就不会有数组溢出的风险了。