常见的格式限定符
整数类型%d 或 %i:有符号十进制整数
%u:无符号十进制整数
%ld:有符号长整型(long int)
%lu:无符号长整型(unsigned long int)
%lld:有符号长长整型(long long int)
%llu:无符号长长整型(unsigned long long int)
%o:无符号八进制整数
%x 或 %X:无符号十六进制整数
浮点数类型%f:浮点数(float)
%lf:双精度浮点数(double)
%Lf:长双精度浮点数(long double)
字符和字符串类型%c:单个字符
%s:字符串(以空格、换行符或制表符为终止符)
[%[characters]]:匹配指定字符集中的字符
指针类型%p:指针地址
宽度限制%Ns:读取最多 N 个字符的字符串(不包括终止符 \0)
%Nc:读取最多 N 个字符
赋值抑制%*:跳过输入的值,不将其存储到变量中
示例
以下是一些使用不同格式限定符的示例:
#include <stdio.h>
int main(void)
{
int i;
unsigned int u;
long int l;
unsigned long int ul;
float f;
double d;
char c;
char str[50];
// 读取有符号十进制整数
printf("Enter an integer: ");
scanf("%d", &i);
printf("You entered: %d\n", i);
// 读取无符号十进制整数
printf("Enter an unsigned integer: ");
scanf("%u", &u);
printf("You entered: %u\n", u);
// 读取有符号长整型
printf("Enter a long integer: ");
scanf("%ld", &l);
printf("You entered: %ld\n", l);
// 读取无符号长整型
printf("Enter an unsigned long integer: ");
scanf("%lu", &ul);
printf("You entered: %lu\n", ul);
// 读取浮点数
printf("Enter a float: ");
scanf("%f", &f);
printf("You entered: %f\n", f);
// 读取双精度浮点数
printf("Enter a double: ");
scanf("%lf", &d);
printf("You entered: %lf\n", d);
// 读取单个字符
printf("Enter a character: ");
scanf(" %c", &c); // 注意前面的空格,用于忽略前导空白字符
printf("You entered: %c\n", c);
// 读取字符串
printf("Enter a string: ");
scanf("%49s", str); // 限制输入长度,防止缓冲区溢出
printf("You entered: %s\n", str);
return 0;
}
注意事项
输入格式:确保输入的格式与 scanf 的格式限定符匹配,否则可能导致未定义行为。
%llu 是用于读取和打印 unsigned long long 类型的正确格式限定符。
%ull 并不是一个有效的格式限定符,不能将%ld、%lu、%llu等写成%dl、%ul、%ull等。
缓冲区溢出:对于字符串输入,建议使用宽度限制(如 %49s)来防止缓冲区溢出。
前导空白字符:在读取字符时,可以在格式字符串前加上空格(如 scanf(" %c", &c)),以忽略前导的空白字符。