格式控制字符串由两部分组成:普通字符(非%字符)和转换说明。普通字符会进行原样输出,每个转换说明都会对应后续的一个参数,通常有几个转换说明就需要提供几个参数(除固定参数之外的参数),使之一一对应,用于控制对应的参数如何进行转换。如下所示:
printf("转换说明 1 转换说明 2 转换说明 3", arg1, arg2, arg3);
这里只是以 printf()函数举个例子,实际上并不这样用。三个转换说明与参数进行一一对应,按照顺序方式一一对应。
每个转换说明都是以%字符开头,其格式如下所示(使用[ ]括起来的部分是可选的):
%[flags][width][.precision][length]type
flags:标志,可包含 0 个或多个标志;
width:输出最小宽度,表示转换后输出字符串的最小宽度;
precision:精度,前面有一个点号" . ";
length:长度修饰符;
type:转换类型,指定待转换数据的类型。
可以看到,只有%和 type 字段是必须的,其余都是可选的。下面分别对这些字段进行介绍。
首先说明 type(类型),因为类型是格式控制字符串的重中之重,是必不可少的组成部分,其它的字段都是可选的,type 用于指定输出数据的类型,type 字段使用一个字符(字母字符)来表示,可取值如下:
flags 规定输出样式,%后面可以跟 0 个或多个以下标志:
最小的输出宽度,用十进制数来表示输出的最小位数,若实际的输出位数大于指定的输出的最小位数,则以实际的位数进行输出,若实际的位数小于指定输出的最小位数,则可按照指定的 flags 标志补 0 或补空格。
width 的可能取值如下:
精度字段以点号" . "开头,后跟一个十进制正数,可取值如下:
长度修饰符指明待转换数据的长度,因为 type 字段指定的的类型只有 int、unsigned int 以及 double 等几种数据类型,但是 C 语言内置的数据类型不止这几种,譬如有 16bit 的 short、unsigned short,8bit 的 char、unsigned char,也有 64bit 的 long long 等,为了能够区别不同长度的数据类型,于是乎,长度修饰符(length)应运而生,成为转换说明的一部分。
length 长度修饰符也是使用字符(字母字符)来表示,结合 type 字段以确定不同长度的数据类型,如下所示:
譬如:
printf("%hd\n", 12345); //将数据以 short int 类型进行转换
printf("%ld\n", 12345); //将数据以 long int 类型进行转换
printf("%lld\n", 12345); //将数据以 long long int 类型进行转换
示例代码
#include
#include
#include
#include
int main(void)
{
char buf[50] = {0};
printf("%d (%s) %d (%s)\n", 520, "我爱你", 1314, "一生一世");
fprintf(stdout, "%d (%s) %d (%s)\n", 520, "我爱你", 1314, "一生一世");
dprintf(STDOUT_FILENO, "%d (%s) %d (%s)\n", 520, "我爱你", 1314, "一生一世");
sprintf(buf, "%d (%s) %d (%s)\n", 520, "我爱你", 1314, "一生一世");
printf("%s", buf);
memset(buf, 0x00, sizeof(buf));
snprintf(buf, sizeof(buf), "%d (%s) %d (%s)\n", 520, "我爱你", 1314, "一生一世");
printf("%s", buf);
exit(0);
}