文章目录
(本篇内容全面,篇幅较长,建议收藏,方便查阅)
1.printf函数的语法简介
printf 是指格式化输出函数,主要功能是向标准输出设备按规定格式输出信息。
printf 是C语言标准库函数,定义于头文件 <stdio.h>。
printf 函数的一般调用格式为:printf("<格式化字符串>", <参量表>) 。输出的字符串除了可以是字母、数字、空格和一些数字符号以外,还可以使用一些转义字符表示特殊的含义
1.1 函数原型
int printf( const char *format, ... );
1.2 头文件
<stdio.h>
1.3 返回值
如果函数执行成功,则返回所打印的字符总数,如果函数执行失败,则返回一个负数。
注意:返回的字符总数将空格和 \n等转义字符都包括在内
#include<stdio.h> //使用printf函数需要包含的头文件
int main()
{
int a = printf("hello world!\n");
printf("%d\n", a);
return 0;
}
1.4 参数
参数format -- 是格式控制字符串,包含了两种类型的对象:普通字符和转换说明 。
普通字符:在输出时,普通字符将原样不动地复制到标准输出。
转换说明:转换说明并不直接输出而是用于控制 printf 中参数的转换和打印。每个转换说明都由一个百分号字符(%)开始,以转换说明符结束,从而说明输出数据的类型、宽度、精度等。
1.5 附加参数
- 附加参数的简介:根据不同的 format 字符串,函数可能需要一系列的附加参数,每个参数包含了一个要被插入的值,替换了 format 参数中指定的每个 % 标签。关于附加参数,既可以是变量,也可以是常量。
- 附加参数的位置:printf()函数的普通字符和转换说明放在" "双引号内,附加参数放在双引号外,每个附加参数之间用逗号隔开
- 附加参数的个数:printf() 的附加参数与转换说明符是⼀⼀对应关系,如果有 n 个转换说明符, printf() 的参数就应该有 n + 1 个。如果参数个数少于对应的转换说明符, printf() 可能会输出内存中的任意值。
printf()函数的参数和附加参数是非常重要的部分,对于理解更深层次的内容是基础
关于参数和附加参数的示例:
#include<stdio.h>
int main()
{
printf("2");
printf("abc");
//打印普通字符
printf("\n");
//打印转义字符
printf("%d peoples are saying %s\n", 2, "hello world");
//peoples are saying 为普通字符,直接输出
//%d 和 %s是转换说明符,分别对应附加参数——整型常量2 和字符串常量hello world
int a = 2;
char arr[] = "hello world";
printf("%d peoples are saying %s\n", a, arr);
//peoples are saying 为普通字符,直接输出
//%d 和 %s是转换说明符,分别对应附加参数——整型变量a 和字符数组arr
return 0;
}
2. 转换说明符
注:转换说明符又被称为 格式控制符、格式占位符、占位符等,不同的名字所代表的含义是相同的
printf 的格式控制字符串 format 中的转换说明组成如下,其中 [ ] 中的部分是可选的,但%
和转换说明符是必不可少的:
%[flags][width][.precision][length]specifier,即:%[标志][最小宽度][.精度][类型长度]转换说明符
转换说明符(specifier)用于规定输出数据的类型,含义如下:
2.1 转换说明符表:
2.2 常见的转换说明符用法示例
#include<stdio.h>
int main()
{
printf("%d\n", 10);//有符号整型十进制
printf("%u\n", 10);//无符号整型十进制
printf("%o\n", 10);//无符号整型八进制
printf("%x\n", 10);//无符号整型十六进制小写
printf("%X\n", 10);//无符号整型十六进制大写
printf("%f\n", 10.0);//浮点型(包括float 和 double)
printf("%c\n", 'a');//字符型
printf("%s\n", "abc");//字符串
int a = 1;
printf("%p\n", &a);//指针型,输出地址
return 0;
}
3.输出格式控制
3.1 标志(flags)
标志(flags)用于规定输出样式,含义如下:
#include<stdio.h>
int main()
{
printf("%-d\n", 10);//左对齐格式
printf("%+d\n", 10);//正数输出带正号
printf("% d\n", 10);//在值之前插入一个空格
printf("%#x\n", 10);//输出时带进制符号
printf("%05d\n", 10);//使用数字0填充宽度
return 0;
}
3.2 最小宽度(width)
最小宽度(width)用于控制显示字段的宽度,用十进制整数来表示输出的最少位数。若实际位数多于指定的宽度,则按实际位数输出,若实际位数少于定义的宽度则补以空格或0。
取值和含义如下:
#include<stdio.h>
int main()
{
printf("%5d\n", 6);//要求最小输出5位,默认右对齐,用空格填充
printf("%05d\n", 6);//也可以运用上面的标志符号 使用0填充
printf("%*d\n", 5, 6);//填充字符用星号指代 内容对应后面的附加参数
printf("%0*d\n", 5, 6);
return 0;
}
输出结果:
3.3 精度(.precision)
精度(.precision)用于指定输出精度,以“.”开头,后跟十进制整数
取值和含义如下:
#include<stdio.h>
int main()
{
printf("%.6d\n", 3);//对于整型,相当于限制输出位数 不足补0
printf("%.6f\n", 3.1415926);//对于浮点型,限制小数点后位数,超出截断
printf("%.6f\n", 3.14);//不足补0
printf("%.6g\n", 3.1415926);//对于g和G,限制总的输出位数
printf("%.6s\n", "abcd efgh");//限制字符串的输出长度,空格计算在内
printf("%.6s\n", "abcd\0efgh");//遇到\0停止
printf("%.f\n", 3.1415926);//如果只有小数点没有数字,默认为保留0位
return 0;
}
运算结果如下:
3.4 类型长度(length)
类型长度(length)用于控制待输出整型数据的数据类型长度,取值和含义如下:
#include<stdio.h>
int main()
{
printf("%d\n", 12345678);//正常打印
printf("%hd\n", 12345678);//解释为短整型输出(可能会丢失数据)
printf("%hd\n", 1234);//解释为短整型输出
printf("%ld\n", 12345678);//解释为长整型输出
return 0;
}
4.其他问题
4.1 转义字符
关于转义字符的问题请查看这篇博客,本文不再重复介绍
【C语言指南】转义字符使用详解所有的 ASCII码都可以用“\加数字”来表示。而C 中定义了一些字母前加“\"来表示常见 - 掘金
4.2 printf语句输出过长时的解决办法
当一条printf语句中的输出内容过长时,放在一行内显示,阅读很不方便,而且很不美观,甚至于不能在一行放下
此时有三种解决方法如下:
-
方法一 使用多个printf语句
-
方法二 在需要换行的地方使用 反斜杠+回车 注意第二行必须从最左侧开始
-
方法三 字符串拼接的方式 将多段内容放在不同的双引号内 两个双引号之间使用回车
#include<stdio.h> int main() { //方法一 使用多个printf语句 printf("Writes the C string pointed"); printf(" by format to the standard output\n");
//方法二 反斜杠+回车 注意第二行必须从最左侧开始 printf("Writes the C string pointed \by format to the standard output\n");
//方法三 字符串拼接的方式 // 将多段内容放在不同的双引号内 两个双引号之间使用回车 printf("Writes the C string pointed " "by format to the standard output\n"); return 0;}
参考资料
printf - C++ Reference (cplusplus.com)
printf(格式化输出函数)_百度百科 (baidu.com)