【C语法学习】printf()函数

1 函数原型

printf():将格式化输出发送至标准输出流stdout,即将格式字符串显示到屏幕,函数原型如下:

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

2 参数

printf()函数的参数分为两类:
(1)format:格式字符串;
(2)… :参数列表。

2.1 格式字符串

在printf()函数中:

  1. 格式字符串是必不可少的;
  2. 格式字符串由字面文本量、转义序列和转换说明三部分组成。

2.1.1 字面文本量

在格式字符串中,除了转义序列和转换说明,剩余的部分都属于字面文本量,字面文本量按照原样显示在屏幕上,代码如下图所示:

int main()
{
   int a = 11;

   printf("The value of a = %d\n", a);
   printf("\n");

   return 0;
}

上面代码中,printf()函数的格式字符串包括:

  1. 转义序列:‘\n’,换行符;
  2. 转换说明:“%d”,按十进制整数显示变量a的值;
  3. 字面文本量:"The value of a = ",即去除转义序列和转换说明后剩余的部分都属于字面文本量,需要保持原样输出。

代码运行结果如下图所示:

在这里插入图片描述

2.1.2 转义序列

关于转义序列:

  1. 所谓转义,即转变字符的含义;
  2. 转义序列以反斜杠字符’'开头;
  3. 反斜杠’字符’告诉编译器以特殊的方式解释下一个字符。

转义序列有两个用途:

  1. 通过移动屏幕光标来控制输出的位置;
  2. 用于表示具有特殊含义的字符。

常用的转义序列如下图所示:

在这里插入图片描述

2.1.3 转换说明

转换说明以百分号字符’%'开头,格式如下:

%[flags][width][.prec][length]type

%[标志][最小宽度][.精度][类型长度]类型。
2.1.3.1 类型

类型是转换说明中比不可少的部分,用于指定printf()函数按照何种格式输出表达式的值,常用的类型如下图所示:
在这里插入图片描述

示例代码如下图所示:

int main ()
{
   printf("以%%d形式打印有符号整数\n");
   printf("%d\n", -123);
   printf("\n");
   
   printf("以%%u形式打印无符号整数\n");
   printf("%u\n", 123);
   printf("\n");

   printf("以%%x/X形式打印无符号整数\n");
   printf("%x\t\t%X\n", 123, 123);
   printf("\n");

   printf("以%%f形式打印浮点数\n");
   printf("%f\n", 0.123456789);
   printf("\n");

   printf("以%%e/E形式打印浮点数\n");
   printf("%e\t%E\n", 0.123456789, 0.123456789);
   printf("\n");

   printf("以%%c形式打印字符\n");
   printf("%c\n", 65);
   printf("\n");

   printf("以%%s形式打印字符串\n");
   printf("%s\n", "Hello World!");
   printf("\n");

   printf("以%%p形式打印指针\n");
   printf("%p\n", "Hello World!");
   printf("\n");

   return 0;
}

代码运行结果如下图所示:

在这里插入图片描述

特别说明

  1. C编译器用双精度来表示浮点型常量;
  2. C编译器在打印浮点数时,默认会打印6位小数;
  3. C编译器在截断小数位时会进行四舍五入操作。
2.1.3.2 类型长度

在打印整形数据时,只有%d对应int型和%u对应unsigned int型,而没有与char、unsigned char、short、unsigned short、long、unsigned long、long long和unsigned long long等数据类型对应的转换说明类型。于是,类型长度应运而生,常用的类型长度如下图所示:
在这里插入图片描述
特别说明:与scanf()函数不同,在printf()函数中,无论float类型还是double类型,都使用%f格式进行输出,不存在%f对应float类型变量,%lf对应double类型变量的说法。

示例代码如下图所示:

int main()
{
   printf("以%%hhd形式输出signed char\n");
   printf("signed char = %hhd\n", 0xff);
   printf("\n");

   printf("以%%hhu形式输出unsigned char\n");
   printf("unsigned char = %hhu\n", 0xff);
   printf("\n");

   printf("以%%hd形式输出signed short\n");
   printf("signed short = %hd\n", 0xffff);
   printf("\n");

   printf("以%%hu形式输出unsigned short\n");
   printf("unsigned short = %hu\n", 0xffff);
   printf("\n");

   printf("以%%ld形式输出signed long\n");
   printf("signed long = %ld\n", 0xffffffff);
   printf("\n");

   printf("以%%lu形式输出unsigned long\n");
   printf("unsigned long = %lu\n", 0xffffffff);
   printf("\n");

   printf("以%%lld形式输出signed long long\n");
   printf("signed long long = %lld\n", 0xffffffffffffffff);
   printf("\n");

   printf("以%%llu形式输出unsigned long long\n");
   printf("unsigned long long = %llu\n", 0xffffffffffffffff);
   printf("\n");

   return 0;
}

代码运行结果如下图所示:

在这里插入图片描述

2.1.3.3 精度

精度以小数点开头,后跟十进制整数,常用于指定浮点数的精度(小数点后数值位数),默认精度是6。

  1. 当浮点数的小数位数小于精度值时,在小数位填充至指定精度值;
  2. 当浮点数的小数位数大于精度值时,将小数位截断至指定精度值(四舍五入)。

示例代码如下图所示:

int main()
{
   printf("默认精度\n");
   printf("Default precision = %f\n", 1000.123456789);
   printf("Default precision = %f\n", 1000.12345);
   printf("\n");

   printf("超过精度-截断\n");
   printf("More than specified precision = %.8f\n", 1000.123456789);
   printf("\n");

   printf("不足精度-填充\n");
   printf("Less than specified precision = %.8f\n", 1000.123456);   
   printf("\n");

   return 0;
}

代码运行结果如下图所示:

在这里插入图片描述

2.1.3.4 最小宽度

最小宽度用十进制整数来表示输出的最少位数,包括整数位、小数点和小数位。

  1. 若实际位数多于指定的宽度,则按实际位数输出;
  2. 若实际位数少于指定的宽度,则左侧填充空格输出(右对齐)。

示例代码如下图所示:

int main()
{
   printf("输出整数-小于最小宽度\n");
   printf("Integer less than specified width = %6d\n", 123);
   printf("\n");

   printf("输出整数-大于最小宽度\n");
   printf("Integer more than specified width = %6d\n", 12300000);
   printf("\n");

   printf("输出浮点数-默认精度-小于最小宽度\n");
   printf("Float-point default   precision less than specified width = %10f\n", 1.23);
   printf("\n");

   printf("输出浮点数-默认精度-大于最小宽度\n");
   printf("Float-point default   precision more than specified width = %6f\n", 1.23);
   printf("\n");

   printf("输出浮点数-指定精度-小于最小宽度\n");
   printf("Float-point specified precision less than specified width = %10.3f\n", 1.23);
   printf("\n");

   printf("输出浮点数-指定精度-大于最小宽度\n");
   printf("Float-point specified precision more than specified width = %10.10f\n", 1.23);
   printf("\n");

   return 0;
}

代码运行结果如下图所示:

在这里插入图片描述

特别说明: 精度优先级高于最小宽度优先级,先将浮点数的小数位填充或截断至默认精度或指定精度,然后再考虑最小宽度。

2.1.3.5 标志

常用的标志如下图所示:
在这里插入图片描述

示例代码如下图所示:

int main()
{
   printf("以16进制前缀形式显示整数\n");
   printf("%#x\n", 123);
   printf("%#X\n", 123);
   printf("\n");
   
   printf("指定最小宽度-默认右对齐-默认左侧填充空格\n");
   printf("%10d\n", 123);
   printf("%10f\n", 1.23);
   printf("\n");

   printf("指定最小宽度-默认右对齐-指定左侧填充数字0\n");
   printf("%010d\n", 123);
   printf("%010f\n", 1.23);
   printf("\n");

   printf("指定最小宽度-指定左对齐-右侧填充空格\n");
   printf("%-10d\n", 123);
   printf("%-10f\n", 1.23);
   printf("\n");

   return 0;
}

代码运行结果如下图所示:

在这里插入图片描述

2.2 参数列表

在printf()函数中:

  1. 参数列表是可选的;
  2. 参数列表中参数的数量是可变的;
  3. 参数列表中参数的类型是任意有效的C表达式

2.3 转换说明和参数列表的关系

  1. 转换说明和表达式在数量、顺序和类型上都要一一对应;
  2. 如果表达式比转换说明多,则未匹配的表达式无法打印出来;
  3. 如果转换说明比表达式多,则未匹配的转换说明打印出"垃圾值"。

示例代码如下图所示:

int main()
{
   int a = 11;
   int b = 22;
   int c = 33;

   printf("表达式比转换说明多\n");
   printf("%d %d\n", a, b, c);
   printf("\n");

   printf("转换说明比表达式多\n");
   printf("%d %d %d %d\n", a, b, c);
   printf("\n");

   return 0;
}

代码运行结果如下图所示:

在这里插入图片描述

3 返回值

返回值类型为int型:

  1. 输出成功,返回输出的总字符数;
  2. 输出失败,返回一个负数。

C语言标准描述如下:

1. Each of these functions returns the number of characters printed, or a negative value if an error occurs.

示例代码如下图所示:

int main()
{
   int ret_val = 0;

   printf("The return value of printf() function = %d\n\n", ret_val = printf("Hello World!\n"));

   return 0;
}

代码运行结果如下图所示:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值