printf()和scanf()的占位符列举——C语言

108 阅读3分钟

如样例代码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
%g6个有效数字的浮点数。整数部分一旦超过6位,就会自动转为科学计数法,指数部分的e为小写。
%G等同于%g,唯一的区别是指数部分的E为大写。
%hd十进制 short int 类型。
%ho八进制 short int类型。
%hx十六进制 short int类型。
%huunsigned short int 类型。
%ld十进制 long int 类型。
%lo八进制long int 类型。
%lx十六进制 long int 类型。
%luunsigned long int 类型。
%lld十进制long long int 类型。
%llo八进制 long long int类型。
%llx十六进制 long long int类型。
%lluunsigned long long int 类型。
%Le科学计数法表示的long double类型浮点数。
%Lflong double类型浮点数。
%n已输出的字符串数量。该占位符本身不输出,只将值存储在指定变量之中。
%o八进制整数。
%p指针(用来打印地址)。
%s字符串。
%u无符号整数(unsigned int)。
%x十六进制整数。
%zdsize_t类型。//sizeof操作符的返回值类型
%%输出一个百分号。

scanf()常用的占位符如下,与printf()的占位符基本一致。

占位符含义
%c字符。
%d整数。
%ffloat类型浮点数。
%lfdouble类型浮点数。
%Lflong 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个字符,后面的字符将被丢弃,这样就不会有数组溢出的风险了。


正文完