int printf ( const char * format, ... );
我可以查看网站:https://legacy.cplusplus.com/,下面是对printf函数返回值的解释:
可知,printf函数的返回值有两种:
#include
int main() {
int ret = printf("Hello, World!\n");
if (ret < 0) {
// 处理错误
perror("printf failed");
} else {
// 输出成功
printf("Successfully printed %d characters.\n", ret);
}
return 0;
}
#include
int main() {
printf("Hello World!");//普通字符,未使用转移字符\n
printf("Good C");
printf("Hello World!\n");//普通字符,使用转移字符\n
printf("Good C");
return 0;
}
通过代码结果,我们可以发现,当我使用了转移字符\n后,Hello World打印完之后进行了换行,接着打印Good C,所以,这就是转移字符\n的作用。常用的转义字符如表
转义字符 | 作用 |
---|---|
\? | 在书写连续多个问号时使用,防止他们被解析成三字母词,在新的编译器上没法验证了。 |
\’ | 用于表示字符常量’ |
\" | 用于表示一个字符内部的双引号 |
\\ | 用于表示字符串里的反斜杠,防止它被解释为一个转义序列符 () |
\a | 警报,这会使得终端发出警报声或出现闪烁,或者两者同时发生 |
\b | 退格符,光标回退一个字符但不删除字符 |
\f | 换页符,光标移到下一页。在现代系统上,这已经反映不出来了,行为改成类似于\v |
\r | 回车符,光标移到同一行的开头 |
\t | 制表符,光标移到下一个水平制表位,通常是下一个4/8的倍数 |
\v | 垂直分隔符,光标移到下一个垂直制表位,通常是下一行的同一列 |
\ddd | d d d表示1~3个八进制的数字 |
\xdd | d d表示两个16进制数字 |
\0 | null 字符,代表没有内容, \0 是\ddd 这类转义字符的一种,用于字符串的结束标志,其ASCII码值是0. |
若想了解更加仔细可以浏览网站:https://zh.cppreference.com/w/c/language/escape
我们可以观察以下代码:
#include
int main() {
int a = 10;
printf("这是int的值:%d\n", a);
return 0;
}
我们可以发现,printf函数里面的 %d 变成了我们的 a的值,所以我们可以知道,像%d这种占位符是会被后面的值替换的。同时占位符的是按顺序来替换的,我们可以参考以下代码:
#include
int main() {
int a = 10;
int b = 11;
int c = 12;
printf("这是a的值:%d,这是b的值:%d,这是c的值:%d\n", a, b, c);
printf("这是a的值:%d,这是b的值:%d,这是c的值:%d\n", c, b, a);
return 0;
}
%[flags][width][.precision][length]specifier
常用标志符如下:
标志符 | 作用 |
---|---|
- | 左对齐输出(默认为右对齐输出) |
+ | 输出的数字总是显示正负号 |
(空格) | 显示正数时显示一个空格 |
# | 显示特定的格式,如:十六进制前缀0x |
0 | 用零填充空白位置(设置宽度时使用) |
#include
int main() {
int Input = 10;
printf("%10d\n", Input);
printf("%-10d\n", Input);
return 0;
结果为:
可以看到,当我没使用左对齐时,输出默认是右对齐的,使用后则为左对齐。其他flags就由小伙伴们研究啦。
指定输出的最小字符数,如果实际内容宽度小于这个宽度,会用空格填补,如果使用了[flags]中的0则填补0。
我们依旧使用上面的例子,可以观察第一句printf语句,前面其实空了8个空格,我们可以在10前面加入0查看一下输出结果。
符号 | 类型 |
---|---|
h | 短整型(short int 或 unsigned short int) |
l | 长整型(long int 或 unsigned long int) |
ll | 长长整形(long long int 或 unsigned long long int) |
j | 整形(intmax_t 或 uintmax_t) |
z | size_t |
t | ptrdiff型(ptrdiff_t) |
L | 长双精度型(long double) |
使用length的好处: 可以确保程序能够正确地处理不同大小的整数和浮点数类型,特别是在涉及到不同平台或需要处理大范围数值的情况下。
作用: 决定如何将参数转换成字符串或从字符串中读取数据。
常用的说明符:
说明符 | 表示 |
---|---|
d 或 i | 有符号的十进制数字 |
u | 无符号的十进制数字 |
x 或 X | 无符号的十六进制整数 |
o | 无符号的八进制数字 |
f | 浮点数 |
e 或 E | 科学计数法表示浮点数 |
g 或 G | 自动选择 f 或 e 格式 |
a 或 A | 十六进制浮点数 |
c | 字符 |
s | 字符串 |
p | 指针 |
n | 存储输出字符的数量 |
% | 输出字面上的% |
所以,我们可以知道,%加上说说明符组成了占位符。
上面又说得到,printf函数是一个输出流函数,将数据输出到标准输出流上,而标准输出流属于标准流。
流: 我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输入输出操作各不相同,为了方便程序员对各种设备进行方便的操作,我们抽象出了流的概念,我们可以把流想象成流淌着字符的河。
标准流: C语言程序打开时默认打开的三个流。
printf函数与流的交互: printf函数调用后会将格式化的数据存入标准输出流的缓冲区,内容不会被立即打印,但是,当缓冲区被刷新后,缓冲区中的内容会被写到底层的输出设备(终端或文件),如果时终端,终端驱动程序会进一步处理这些数据,将其显示在屏幕上。
感谢你的阅读,本人是大一新生,因为时间有限,一些字符的用法就不具体举例啦,如果有错误的地方,也请大佬指正,谢谢大家!