printf和scanf函数的探索

printf()是输出函数,scanf()是输入函数,输入/输出函数简称为I/O函数。它两是C语言中最通用的输入输出函数。不同的编译器可能有不同的I/O的实现。

printf和scanf这两个函数虽然功能不同,但是工作原理几乎相同,它们都使用格式字符串(control string)和参数列表

printf(control string,arg1,arg2···)

格式字符串中含有一系列转换说明(conversion specification),它们与参数列表应该是一一对应的,即数量和类型应相匹配

printf中的基本转换说明如下:

  • %d和%i用于打印有符号十进制整数,%o用于打印无符号八进制整数,%u用于打印无符号十进制整数,%x用于打印打印0f前缀的无符号十六进制整数,%X用于打印打印0F前缀的无符号十六进制整数;
  • %f用于打印十进制记数法形式的浮点数,%e和%E用于打印e记数法1形式的浮点数;
  • %c用于打印单个字符,%s用于打印字符串;
  • %g根据值的不同,自动切换为%f或%e,当指数小于 -4 或大于等于精度时切换为%e,%G根据值的不同,自动切换为%f或%E,当指数小于 -4 或大于等于精度时切换为%e;
  • %p用于打印指针;
  • %a和%A用于打印浮点数、十六进制数和p记数法2 (C99/C11);
  • %%用于打印一个百分号。

在%和基本转换说明之间还可以插入修饰符组成更为复杂的conversion specifier,修饰符用来控制打印内容的格式或用于打印指定的数据类型,printf的修饰符如下:

  • *:抑制赋值(suppress assignment)。
  • -: 左对齐输出。
  • +: 对于正数,在前面显示加号;对于负数,则仍然显示减号。
  • 0: 在输出数字时,用零来填充字段宽度。
  • 空格: 对于正数,在前面显示一个空格,对于负数则显示减号。
  • #: 与o、x或X转换说明一起使用时,将输出前缀0、0x或0X(0、0x或0X)。
  • width: 指定输出的最小字段宽度,超出就自动扩大到打印内容的长度。
  • .precision: 指定输出的精度,通常用于浮点数以及字符串。
  • h: 将整数参数解释为short或者unsigned short。
  • hh: 将整数参数解释为char或者unsigned char。
  • l: 将整数参数解释为long或者unsigned long。
  • ll: 将整数参数解释为long long或者unsigned long long。
  • L: 将浮点数参数解释为long double。
  • j: 将整数参数解释为intmax_t或uintmax_t。
  • t: 将整数参数解释为ptrdiff_t或size_t。
  • z: 将整数参数解释为size_t。size_t是sizeof返回的类型。

抑制赋值示例

printf("%*d",5,10);//打印10,宽度为5
scanf("%*d %d",&a);//若输入为1 2,则a为2,即会跳过1

在K&R C中,表达式和参数中的float会自动转为double,而ANSI C一般不会,所以为了保护一些假设float会自动转换为double的程序,默认将float转为double。3

冷知识:printf有返回值,值为打印字符的个数,若发生打印错误,则返回负数。

printf的使用中还要注意当待打印类型和转换说明不一致时会发生什么。

接下来学习scanf。前面介绍的printf将各种类型的数据经过转换说明的转换后输出为字符串,而scanf则是相反的过程,它将我们在键盘上敲入的文本转换为指定类型数据。

scanf与printf不相同的地方在于参数列表,scanf的参数前需要加上一个&符号(除了存储字符串的时候),表示存储。

scanf的基本转换说明如下:

  • %c解释输入为一个字符;%s解释输入为一个字符串,输入有效范围为从一个非空白字符开始到一个空白字符之前。
  • %d和%i解释输入为一个有符号十进制整数;%o解释输入为一个有符号八进制整数;%x或%X解释输入为一个有符号十六进制整数;%u解释输入为一个无符号十进制整数。
  • %e、%f、%g、%a或%E、%F、%G、%A解释输入为一个浮点数。

scanf的修饰符如下:

  • *:抑制赋值。
  • 数字:最大输入宽度。
  • hh:读取整数为signed char或unsigned char。
  • ll:读取整数位long long或unsigned long long。
  • h:%hd、%hi读取值为short int,%ho、%hx、%hu读取值为unsigned short int。
  • l:%ld、%li读取值为long,%lo、%lx、%lu读取值为unsigned long,%le、%lf、%lg读取值为double类型。
  • L:%Le、%Lf、%Lg读取值为long double类型。
  • j:与整型转换说明配合使用,表示使用intmax_t、uintmax_t。
  • z:与整型转换说明配合使用,表示使用sizeof的返回值类型。
  • t:与整型转换说明配合使用,表示使用两个指针差值的类型。

scanf也有返回值。如果读取成功,则返回读取到的项数;如果需要读取数字时,用户输入非数字字符串,则返回0;如果检测到文件结尾,则返回EOF。


  1. e记数法:例如2e-30表示 2 × 1 0 − 30 2\times 10^{-30} 2×1030,其中e换为E也行 ↩︎

  2. p记数法是16进制指数记数法。例如 0 x c . 1 b p 5 = ( 12 + 1 16 + 11 16 ) × 2 5 0xc.1bp5=(12+\frac{1}{16}+\frac{11}{16})\times 2^5 0xc.1bp5=(12+161+1611)×25 ↩︎

  3. K&R C指的是Kernighan和Ritchie开发的C语言,即第一版C语言标准,而ANSI C(也称为C89或C90)是由美国国家标准协会(ANSI)发布的C语言标准。 ↩︎

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值