C语言printf()函数详解

简介: C语言printf()函数详解

1.printf函数的语法简介

printf 是指格式化输出函数主要功能是向标准输出设备按规定格式输出信息

printf 是C语言标准库函数,定义于头文件 。

printf 函数的一般调用格式为:printf("<格式化字符串>", <参量表>) 。输出的字符串除了可以是字母、数字、空格和一些数字符号以外,还可以使用一些转义字符表示特殊的含义

1.1 函数原型

int printf( const char *format, ... );

1.2 头文件

1.3 返回值

如果函数执行成功,则返回所打印的字符总数,如果函数执行失败,则返回一个负数。

注意:返回的字符总数将空格和 \n等转义字符都包括在内

#include<stdio.h> //使用printf函数需要包含的头文件
int main()
{
  int a = printf("hello world!\n");
  printf("%d\n", a);
  return 0;
}

image.png

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;
}

image.png

2. 转换说明符

注:转换说明符又被称为 格式控制符、格式占位符、占位符等,不同的名字所代表的含义是相同的

printf 的格式控制字符串 format 中的转换说明组成如下,其中 [ ] 中的部分是可选的,但%

和转换说明符是必不可少的:

%[flags][width][.precision][length]specifier,即:%[标志][最小宽度][.精度][类型长度]转换说明符

转换说明符(specifier)用于规定输出数据的类型,含义如下:

2.1 转换说明符表:

说明符(specifier)

对应数据类型

描述

d / i

int

输出类型为有符号的十进制整数,i 是老式写法

o

unsigned int

输出类型为无符号八进制整数(没有前导 0)

u

unsigned int

输出类型为无符号十进制整数

x / X

unsigned int

输出类型为无符号十六进制整数,x 对应的是 abcdef,X 对应的是 ABCDEF(没有前导 0x 或者 0X)

f / lf

double

输出类型为十进制表示的浮点数,默认精度为6(lf 在 C99 开始加入标准,意思和 f 相同)

e / E

double

输出类型为科学计数法表示的数,此处 "e" 的大小写代表在输出时用的 “e” 的大小写,默认浮点数精度为6

g

double

根据数值不同自动选择 %f 或 %e,%e 格式在指数小于-4或指数大于等于精度时用使用 

G

double

根据数值不同自动选择 %f 或 %E,%E 格式在指数小于-4或指数大于等于精度时用使用

c

char

输出类型为字符型。可以把输入的数字按照ASCII码相应转换为对应的字符

s

char *

输出类型为字符串。输出字符串中的字符直至遇到字符串中的空字符(字符串以 '\0‘ 结尾,这个 '\0' 即空字符)或者已打印了由精度指定的字符数

p

void *

以16进制形式输出指针

%

不转换参数

不进行转换,两个%表示输出一个字符‘%’(百分号)本身

n

int *

到此字符之前为止,一共输出的字符个数,不输出文本 

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;
}

image.png

3.输出格式控制

3.1 标志(flags)

标志(flags)用于规定输出样式,含义如下:

标志 描述
- 在给定的字段宽度内左对齐;          右对齐是默认值(请参阅宽度子说明符)。
+ 强制在结果前面加上加号或减号(+ 或 -),即使对于正数也是如此。默认情况下,只有负数前面带有 - 符号。
(空格) 如果不写符号,则在值之前插入一个空格。
# 与 o、x 或 X 说明符一起使用时,对于不为零的值,该值前面分别带有 0、0x 或 0X。
与 e、E、f、F、g 或 G 一起使用时,即使后面没有更多数字,它也会强制写入的输出包含小数点。默认情况下,如果没有数字跟随,则不写入小数点。
0 指定填充时,用零 (0) 而不是空格填充数字(请参阅宽度子说明符)。
#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;
}

image.png

3.2 最小宽度(width)

最小宽度(width)用于控制显示字段的宽度,用十进制整数来表示输出的最少位数。若实际位数多于指定的宽度,则按实际位数输出,若实际位数少于定义的宽度则补以空格或0。

取值和含义如下:

width(最小宽度)

字符名称

描述

digit(n)

数字

字段宽度的最小值,如果输出的字段长度小于该数,结果会用前导空格填充;如果输出的字段长度大于该数,结果使用更宽的字段,不会截断输出 

*

星号

宽度在 format 字符串中规定位置未指定,使用星号标识附加参数,指示下一个参数是width 

#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;
}

输出结果:

image.png

3.3 精度(.precision)

精度(.precision)用于指定输出精度,以“.”开头,后跟十进制整数

取值和含义如下:

.precision(精度)

字符名称

描述

.digit(n)

点+数字

对于整数说明符(d、i、o、u、x、X):precision 指定了要打印的数字的最小位数。如果写入的值短于该数,结果会用前导零来填充。如果写入的值长于该数,结果不会被截断。精度为 0 意味着不写入任何字符;

对于 e、E 和 f 说明符:要在小数点后输出的小数位数;

对于 g 和 G 说明符:要输出的最大有效位数;

对于 s 说明符:要输出的最大字符数。默认情况下,所有字符都会被输出,直到遇到末尾的空字符;

对于 c 说明符:没有任何影响;

当未指定任何精度时,默认为 1。如果指定时只使用点而不带有一个显式值,则标识其后跟随一个 0。 

.*

点+星号

精度在 format 字符串中规定位置未指定,使用点+星号标识附加参数,指示下一个参数是精度 

#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;
}

运算结果如下:

image.png

3.4 类型长度(length)

类型长度(length)用于控制待输出整型数据的数据类型长度,取值和含义如下:

length(类型长度)

描述

h

参数被解释为短整型或无符号短整型(仅适用于整数说明符:i、d、o、u、x 和 X) 

l

参数被解释为长整型或无符号长整型,适用于整数说明符(i、d、o、u、x 和 X)及说明符 c(表示一个宽字符)和 s(表示宽字符字符串) 

#include<stdio.h>
int main()
{
  printf("%d\n", 12345678);//正常打印
  printf("%hd\n", 12345678);//解释为短整型输出(可能会丢失数据)
  printf("%hd\n", 1234);//解释为短整型输出
  printf("%ld\n", 12345678);//解释为长整型输出
  return 0;
}

image.png

4.其他问题

4.1 转义字符

关于转义字符的问题请查看这篇博客,本文不再重复介绍

转义字符使用详解【C语言】-CSDN博客

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;
}

image.png

参考资料  

printf - C++ Reference (cplusplus.com)

printf(格式化输出函数)_百度百科 (baidu.com)

 

目录
打赏
0
0
0
0
17
分享
相关文章
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
62 23
|
1月前
|
【C语言程序设计——函数】利用函数求解最大公约数和最小公倍数(头歌实践教学平台习题)【合集】
本文档介绍了如何编写两个子函数,分别求任意两个整数的最大公约数和最小公倍数。内容涵盖循环控制与跳转语句的使用、最大公约数的求法(包括辗转相除法和更相减损术),以及基于最大公约数求最小公倍数的方法。通过示例代码和测试说明,帮助读者理解和实现相关算法。最终提供了完整的通关代码及测试结果,确保编程任务的成功完成。
67 15
|
1月前
|
【C语言程序设计——函数】亲密数判定(头歌实践教学平台习题)【合集】
本文介绍了通过编程实现打印3000以内的全部亲密数的任务。主要内容包括: 1. **任务描述**:实现函数打印3000以内的全部亲密数。 2. **相关知识**: - 循环控制和跳转语句(for、while循环,break、continue语句)的使用。 - 亲密数的概念及历史背景。 - 判断亲密数的方法:计算数A的因子和存于B,再计算B的因子和存于sum,最后比较sum与A是否相等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台对代码进行测试,预期输出如220和284是一组亲密数。 5. **通关代码**:提供了完整的C语言代码实现
61 24
|
1月前
|
【C语言程序设计——函数】递归求斐波那契数列的前n项(头歌实践教学平台习题)【合集】
本关任务是编写递归函数求斐波那契数列的前n项。主要内容包括: 1. **递归的概念**:递归是一种函数直接或间接调用自身的编程技巧,通过“俄罗斯套娃”的方式解决问题。 2. **边界条件的确定**:边界条件是递归停止的条件,确保递归不会无限进行。例如,计算阶乘时,当n为0或1时返回1。 3. **循环控制与跳转语句**:介绍`for`、`while`循环及`break`、`continue`语句的使用方法。 编程要求是在右侧编辑器Begin--End之间补充代码,测试输入分别为3和5,预期输出为斐波那契数列的前几项。通关代码已给出,需确保正确实现递归逻辑并处理好边界条件,以避免栈溢出或结果
63 16
【C语言程序设计——函数】分数数列求和2(头歌实践教学平台习题)【合集】
函数首部:按照 C 语言语法,函数的定义首部表明这是一个自定义函数,函数名为fun,它接收一个整型参数n,用于指定要求阶乘的那个数,并且函数的返回值类型为float(在实际中如果阶乘结果数值较大,用float可能会有精度损失,也可以考虑使用double等更合适的数据类型,这里以float为例)。例如:// 函数体代码将放在这里函数体内部变量定义:在函数体中,首先需要定义一些变量来辅助完成阶乘的计算。比如需要定义一个变量(通常为float或double类型,这里假设用float。
36 3
【C语言程序设计——函数】分数数列求和1(头歌实践教学平台习题)【合集】
if 语句是最基础的形式,当条件为真时执行其内部的语句块;switch 语句则适用于针对一个表达式的多个固定值进行判断,根据表达式的值与各个 case 后的常量值匹配情况,执行相应 case 分支下的语句,直到遇到 break 语句跳出 switch 结构,若没有匹配值则执行 default 分支(可选)。例如,在判断一个数是否大于 10 的场景中,条件表达式为 “num> 10”,这里的 “num” 是程序中的变量,通过比较其值与 10 的大小关系来确定条件的真假。常量的值必须是唯一的,且在同一个。
19 2
【C语言程序设计——函数】回文数判定(头歌实践教学平台习题)【合集】
算术运算于 C 语言仿若精密 “齿轮组”,驱动着数值处理流程。编写函数求区间[100,500]中所有的回文数,要求每行打印10个数。根据提示在右侧编辑器Begin--End之间的区域内补充必要的代码。如果操作数是浮点数,在 C 语言中是不允许直接进行。的结果是 -1,因为 -7 除以 3 商为 -2,余数为 -1;注意:每一个数据输出格式为 printf("%4d", i);的结果是 1,因为 7 除以 -3 商为 -2,余数为 1。取余运算要求两个操作数必须是整数类型,包括。开始你的任务吧,祝你成功!
52 1
【C语言】字符串操作函数详解
这些字符串操作函数在C语言中提供了强大的功能,帮助开发者有效地处理字符串数据。通过对每个函数的详细讲解、示例代码和表格说明,可以更好地理解如何使用这些函数进行各种字符串操作。如果在实际编程中遇到特定的字符串处理需求,可以参考这些函数和示例,灵活运用。
93 10
【C语言】文件操作函数详解
C语言提供了一组标准库函数来处理文件操作,这些函数定义在 `<stdio.h>` 头文件中。文件操作包括文件的打开、读写、关闭以及文件属性的查询等。以下是常用文件操作函数的详细讲解,包括函数原型、参数说明、返回值说明、示例代码和表格汇总。
68 9
【C语言】常用函数汇总表
本文总结了C语言中常用的函数,涵盖输入/输出、字符串操作、内存管理、数学运算、时间处理、文件操作及布尔类型等多个方面。每类函数均以表格形式列出其功能和使用示例,便于快速查阅和学习。通过综合示例代码,展示了这些函数的实际应用,帮助读者更好地理解和掌握C语言的基本功能和标准库函数的使用方法。感谢阅读,希望对你有所帮助!
62 8
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等