【C语言】printf函数的学习与使用

printf函数的学习与使用

  • printf 函数的介绍:
    • 1.printf 函数的一般形式
    • 2.prinf 函数的返回值
    • 3.format 解释
      • 3.1 转义字符
      • 3.2 格式说明符(占位符)
        • 3.2.1 flags 标志
        • 3.2.2 width 宽度
        • 3.2.3 precision 精度
        • 3.2.4 length 长度
        • 3.2.5 specifier 说明符
  • printf 函数与流
  • End


printf 函数的介绍:

  • printf 函数是一个非常常用的函数,是一个输出流函数,将格式化的数据输出到标准输出流
  • printf 函数属于

1.printf 函数的一般形式

int printf ( const char * format, ... );
  • format是一个格式化字符串,它指定后续参数如何被格式化和显示。
  • 表示可变量的参数,这些参数将按照format字符串的格式被处理
  • 格式化数据如下:
    • 普通的字符:“abcdef”等字符串
    • 转义序列(转义字符):\n换行符,\t制表符等
    • 格式说明符(占位符)

2.prinf 函数的返回值

我可以查看网站:https://legacy.cplusplus.com/,下面是对printf函数返回值的解释:
【C语言】printf函数的学习与使用_第1张图片
可知,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;
}

3.format 解释

3.1 转义字符

#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


3.2 格式说明符(占位符)

我们可以观察以下代码:

#include 

int main() {
   int a = 10;
   printf("这是int的值:%d\n", a);
   return 0;
}

【C语言】printf函数的学习与使用_第2张图片
我们可以发现,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;
}

【C语言】printf函数的学习与使用_第3张图片
对于format的一般形式,我们有这样的定义:

%[flags][width][.precision][length]specifier
  • flags:标志
  • width:宽度
  • .precision:精度
  • length:长度
  • specifier:说明符

3.2.1 flags 标志

常用标志符如下:

标志符 作用
- 左对齐输出(默认为右对齐输出)
+ 输出的数字总是显示正负号
(空格) 显示正数时显示一个空格
# 显示特定的格式,如:十六进制前缀0x
0 用零填充空白位置(设置宽度时使用)
  • 左对齐例子
 #include 

int main() {
   int Input = 10;
   printf("%10d\n", Input);
   printf("%-10d\n", Input);
   return 0;

结果为:
【C语言】printf函数的学习与使用_第4张图片
可以看到,当我没使用左对齐时,输出默认是右对齐的,使用后则为左对齐。其他flags就由小伙伴们研究啦。

3.2.2 width 宽度

指定输出的最小字符数,如果实际内容宽度小于这个宽度,会用空格填补,如果使用了[flags]中的0则填补0。

我们依旧使用上面的例子,可以观察第一句printf语句,前面其实空了8个空格,我们可以在10前面加入0查看一下输出结果。
【C语言】printf函数的学习与使用_第5张图片


3.2.3 precision 精度
  • 对于整数,表示最小的位数。
  • 对于浮点数,表示小数点后小数位数。
  • 可以使用*,由后的参数指定精度。
    我来观察下面的图片:
    【C语言】printf函数的学习与使用_第6张图片

3.2.4 length 长度
符号 类型
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的好处: 可以确保程序能够正确地处理不同大小的整数和浮点数类型,特别是在涉及到不同平台或需要处理大范围数值的情况下。


3.2.5 specifier 说明符

作用: 决定如何将参数转换成字符串或从字符串中读取数据。
常用的说明符:

说明符 表示
d 或 i 有符号的十进制数字
u 无符号的十进制数字
x 或 X 无符号的十六进制整数
o 无符号的八进制数字
f 浮点数
e 或 E 科学计数法表示浮点数
g 或 G 自动选择 f 或 e 格式
a 或 A 十六进制浮点数
c 字符
s 字符串
p 指针
n 存储输出字符的数量
% 输出字面上的%

所以,我们可以知道,%加上说说明符组成了占位符。


printf 函数与流

上面又说得到,printf函数是一个输出流函数,将数据输出到标准输出流上,而标准输出流属于标准流

流: 我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输入输出操作各不相同,为了方便程序员对各种设备进行方便的操作,我们抽象出了流的概念,我们可以把流想象成流淌着字符的河。

标准流: C语言程序打开时默认打开的三个流。

  • 标准输出流 stdout 用于从标准输入设备(通常是键盘)读取数据。
  • 标准输入流 stdin 用于向标准输出设备(通常是屏幕)发送数据。
  • 标准错误流 stderr 用于向标准错误设备(通常是屏幕)发送错误消息和诊断信息。

printf函数与流的交互: printf函数调用后会将格式化的数据存入标准输出流的缓冲区,内容不会被立即打印,但是,当缓冲区被刷新后,缓冲区中的内容会被写到底层的输出设备(终端或文件),如果时终端,终端驱动程序会进一步处理这些数据,将其显示在屏幕上。


End

感谢你的阅读,本人是大一新生,因为时间有限,一些字符的用法就不具体举例啦,如果有错误的地方,也请大佬指正,谢谢大家!

你可能感兴趣的:(C语言,学习,c语言)