C语言—printf()

作者:追风剑情 发布于:2019-7-16 21:34 分类:C

示例:


  1. #include <stdio.h>
  2. int main(void)
  3. {
  4. int x = 100;//十进制
  5. int x1 = 0100;//八进制
  6. int x2 = 0x100;//或0X100 十六进制
  7. long x3 = 100L;//或100l
  8. long x4 = 020L;
  9. long x5 = 0x10L;
  10. long long x6 = 3LL;
  11. unsigned long long x7 = 3ULL;//或3ull
  12. unsigned long long x8 = 3LLU;//或2llu
  13.  
  14. long int estine = 99;
  15. long johns;//等效于long int johns;
  16. short int erns = 98;
  17. short ribs;//等效于short int ribs;
  18. //C90标准新增的
  19. unsigned int s_count = 100;
  20. unsigned players;
  21. unsigned long headcount;
  22. unsigned short yesvotes;
  23. //long long类型是C99标准新增的
  24. long long ago;//等效于long long int ago;
  25.  
  26. //在printf()中只能使用小写%?
  27. printf("s_count = %u; estine = %ld", s_count, estine);
  28. printf("dec = %d; octal = %o; hex = %x \n", x, x, x);
  29. //ld, lo, lx表示long类型的的10进制,8进制,16进制
  30. printf("dec = %ld; octal = %lo; hex = %lx \n", x3, x3, x3);
  31. //h表示short
  32. printf("dec = %hd; octal = %ho; hex = %hx \n", erns, erns, erns);
  33. //如果要显示各进制前缀,需要加#
  34. printf("dec = %d; octal = %#o; hex = %#x \n", x, x, x);
  35. //%lu表示unsigned long
  36. //%lld表示long long
  37. //%llu表示unsigned long long
  38.  
  39. //打印浮点数
  40. float aboat = 32000.0;
  41. double abet = 2.14e9;
  42. long double dip = 5.32e-5;
  43. //%f打印十进制记数的float
  44. //%e打印指数记数的float
  45. //如果系统支持十六进制格式的浮点数,可用a和A分别代替e和E
  46. //%Lf、%Le、%La打印long double
  47. printf("aboat=%a, abet=%f; abet=%e \n", aboat, abet, abet);
  48. printf("dip=%Lf; dip=%Le \n", dip, dip);
  49.  
  50. //C99和C11提供%zd用来打印sizeof()的返回值,
  51. //不支持C99和C11的编译器可用%u或%lu代替%zd
  52. printf("size=%zd \n", sizeof(long long));
  53.  
  54. //多个用双引号括起的字符串可以连接
  55. //下面两句代码等价
  56. printf("a""b" "c" "\n");
  57. printf("abc\n");
  58.  
  59. getchar();
  60. return 0;
  61. }


运行测试

1111.png

转换说明及其打印的输出结果
转换说明 输出
%a 浮点数、十六进制数和p记数法( C99/C11 )
%A 浮点数、十六进制数和p记数法( C99/C11 )
%c 单个字符
%d 有符号十进制整数
%e 浮点数,e记数法
%E 浮点数,e记数法
%f 浮点数,十进制记数法
%g 根据值的不同,自动选择%f或%e。%e格式用于指数小于-4或者大于或等于精度时
%G 根据值的不同,自动选择%f或%E。%E格式用于指数小于-4或者大于或等于精度时
%i 有符号十进制整数(与%d相同)
%o 无符号八进制整数
%p 指针
%s 字符串
%u 无符号十进制整数
%x 无符号十六进制整数,使用十六进制数0f
%X 无符号十六进制整数,使用十六进制数0F
%% 打印一个百分号

printf()的修饰符
修饰符 含义
标记 5种标记(-、+、空格、#、0),可以不使用标记或使用多个标记。示例:"%-10d"
数字 最小字段宽度
如果该字段不能容纳待打印的数字或字符串,系统会使用更宽的字段。示例:”%4d“
.数字 精度
对于%e、%E和%f转换,表示小数点右边数字的位数
对于%g和%G转换,表示有效数字最大位数
对于%s转换,表示待打印字符的最大数量
对于整数转换,表示待打印数字的最小位数
如有必要,使用前导0来达到这个位数
只使用.表示其后跟随一个0,所以%.f和%.0f相同
示例:”%5.2f“打印一个浮点数,字段宽度为5字符,其中小数点后有两位数字
h 和整型转换说明一起使用,表示short int 或 unsigned short int 类型的值
示例:”%hu、%hx、%6.4hd“
hh 和整型转换说明一起使用,表示signed char 或 unsigned char 类型的值
示例:”%hhu、%hhx、%6.4hd“
j 和整型转换说明一起使用,表示intmax_t 或 uintmax_t 类型的值。这些类型定义在stdint.h中
示例:”%jd、%8jx“
l 和整型转换说明一起使用,表示long int 或 unsigned long int 类型的值
示例:”%ld、%8ld“
ll 和整型转换说明一起使用,表示long long int 或 unsigned long long int 类型的值(C99)
示例:”%lld、%8llu“
L 和整型转换说明一起使用,表示long double 类型的值
示例:”%Ld、%10.4Le“
t 和整型转换说明一起使用,表示ptrdiff_t 类型的值。ptrdiff_t是两个指针差值的类型(C99)
示例:”%td、%12ti“
z 和整型转换说明一起使用,表示size_t 类型的值。size_t是sizeof返回的类型(C99)
示例:”%zd、%12zd“

printf()的标记
标记 含义
- 待打印项左对齐。即,从字段的左侧开始打印该项。
示例:“%-20s”
+ 有符号值若为正,则在值前面显示加号;若为负,则在值前面显示减号
示例:“%+6.2f”
空格 有符号值若为正,则在值前面显示前导空格(不显示任何符号);若为负,则在值前面显示减号,+标记覆盖一个空格
示例:“%6.2f” 
# 把结果转换为另一种形式。如果是%o格式,则以0开始;如果是%x或%X格式,则以0x或0X开始;对于所有的浮格式,#保证了即使后面没有任何数字,也打印一个小数点字符。对于%g或%G格式,#防止结果后面的0被删除
示例:“%#o、%#8.0f、%+#10.3e”
0 对于数字格式,用前导0代替空格填充字段宽度。对于整数格式同,如果出现-标记或指定精度,则忽略该标记

注意   float参数的转换
      对于浮点类型,有用于double和long double类型的转换说明,却没有float类型的。这是因为在K&R C中,表达式或参数中的float类型值会被自动转换成double类型。一般而言,ANSIC不会把float自动转换成double。然而,为保护大量假设float类型的参数被自动转换成double的现有程序,printf()函数中所有float类型的参数(对未使用显示原型的所有C函数都有效)仍自动转换成double类型。因此,无论是K&R C还是ANSI C,都没有显示float类型值专用的转换说明。

示例:打印不同字段宽度的整数

  1. //Visual Studio中加上这句才可以使用scanf()
  2. //否则只能使用scanf_s()
  3. #define _CRT_SECURE_NO_WARNINGS
  4. #include <stdio.h>
  5.  
  6. #define PAGES 959
  7.  
  8. int main(void)
  9. {
  10. printf("*%d*\n", PAGES);
  11. //打印两个字段宽度
  12. printf("*%2d*\n", PAGES);
  13. //打印10个字段宽度且右对齐
  14. printf("*%10d*\n", PAGES);
  15. //打印10个字段宽度且左对齐
  16. printf("*%-10d*\n", PAGES);
  17.  
  18. system("pause");
  19. return 0;
  20. }

运行测试
111.png

示例:打印不同字段宽度的浮点数

  1. //Visual Studio中加上这句才可以使用scanf()
  2. //否则只能使用scanf_s()
  3. #define _CRT_SECURE_NO_WARNINGS
  4. #include <stdio.h>
  5.  
  6. #define PAGES 959
  7.  
  8. int main(void)
  9. {
  10. //声明常量
  11. const double RENT = 3852.99;
  12. //自动适配字段宽度
  13. printf("*%f*\n", RENT);
  14. //自动适配字段宽度,科学记数法表示
  15. printf("*%e*\n", RENT);
  16. //右对齐,4个字段宽,保留2位小数
  17. printf("*%4.2f*\n", RENT);
  18. //右对齐,3个字段宽,保留1位小数,会自动进行四舍五入
  19. printf("*%3.1f*\n", RENT);
  20. //右对齐,10个字段宽,保留3位小数
  21. printf("*%10.3f*\n", RENT);
  22. //右对齐,10个字段宽,保留3位小数,科学记数法表示
  23. printf("*%10.3E*\n", RENT);
  24. //左对齐,4个字段宽,保留2位小数
  25. printf("*%+4.2f*\n", RENT);
  26. //右对齐,前面补0,10个字段宽,保留2位小数
  27. printf("*%010.2f*\n", RENT);
  28.  
  29. printf("--------------\n");
  30.  
  31. //输出十六进制
  32. printf("%x %X %#x\n", 31, 31, 31);
  33. printf("**%d**% d**% d**\n", 42, 42, -42);
  34. //0标记和精度一起出现时,0标记会被忽略
  35. printf("**%5d**%5.3d**%05d**%05.3d**\n", 6, 6, 6, 6);
  36.  
  37. system("pause");
  38. return 0;
  39. }


运行测试
1111.png

示例:打印不同字段宽度的字符串

  1. #include <stdio.h>
  2. #define BLURB "Authentic imitation!"
  3. int main(void)
  4. {
  5. printf("[%2s]\n", BLURB);
  6. printf("[%24s]\n", BLURB);
  7. printf("[%24.5s]\n", BLURB);
  8. printf("[%-24.5s]\n", BLURB);
  9. printf("The %s family just may be $%.2f richer!\n", "AAA", 5.789);
  10.  
  11. system("pause");
  12. return 0;
  13. }

运行测试
1111.png


示例:转换说明的意义


  1. #include <stdio.h>
  2. #define PAGES 336
  3. #define WORDS 65618
  4. int main(void)
  5. {
  6. /*
  7. 转换说明符并不会转换数据类型,只是把要转换的数在内存中的二进制值,
  8. 按照转换符代表的数据类型进行解析。
  9. */
  10.  
  11. //一些不匹配的整型转换
  12. short num = PAGES;
  13. short mnum = -PAGES;
  14.  
  15. printf("num as short and unsigned short: %hd %hu\n", num, num);
  16. /*
  17. 注意:无符号与有符号整数的转换
  18. short int的大小是2字节;0~32767代表它们本身,而数字32768~65535则表示负数。
  19. 其中,65535表示-1,65534表示-2,以此类推。因此-336表示为65200(即,65536-336)
  20. */
  21. printf("-num as short and unsigned short: %hd %hu\n", mnum, mnum);
  22. printf("num as int and char: %d %c\n", num, num);
  23. /*
  24. int转short int时,int只处理后两个字节,前面的会被截掉。
  25. 大于255的整数转%c,只会处理最后一个字节,前面字节会被截掉。
  26. */
  27. printf("WORDS as int, short, and char: %d %hd %c\n", WORDS, WORDS, WORDS);
  28. /** 混淆整型和浮点型,结果更奇怪 **/
  29. float n1 = 3.0;
  30. double n2 = 3.0;
  31. long n3 = 2000000000;
  32. long n4 = 1234567890;
  33.  
  34. printf("%.le %.le %.le %.le\n", n1, n2, n3, n4);
  35. printf("%ld %ld\n", n3, n4);
  36. printf("%ld %ld %ld %ld\n", n1, n2, n3, n4);
  37.  
  38. system("pause");
  39. return 0;
  40. }


运行测试

111.png

参数传递
参数传递机制因实现而异。下面以我们的系统为例,分析参数传递的原理。函数调用如下:
printf("%ld %ld %ld %ld\n", n1, n2, n3, n4);
该调用告诉计算机把变量n1、n2、n3和n4的值传递给程序。这是一种常见的参数传递方式。程序把传入的值放入被称为栈(stack)的内存区域。计算机根据变量类型(不是根据转换说明)把这些值放入栈中。因此,n1被储存在栈中,占8字节(float类型被转换成double类型)。同样,n2也在栈中占8字节,而n3和n4在栈中分别占4字节。然后,控制转到printf()函数。该函数根据转换说明(不是根据变量类型)从栈中读取值。%ld转换说明表明printf()应该读取4字节,所以printf()读取栈中的前4字节作为第1个值。这是n1的前半部分,将被解释成一个long类型的整数。根据下一个%ld转换说明,printf()再读取4字节,这是n1的后半部分,将被解释成第2个long类型的整数。类似地,根据第3个和第4个%ld,printf()读取n2的前半部分和后半部分,并解释成两个long类型的整数。因此,对于n3和n4,虽然用了转换说明,但printf()还是读错了字节。

示例:printf()函数的返回值


  1. #include <stdio.h>
  2. //argc: 参数个数 argv[]: 参数数组
  3. int main(int argc, char *argv[])
  4. {
  5. int bph2o = 212;
  6. int rv;
  7.  
  8. //printf()返回打印字符的个数(包括空格及不可见字符),
  9. //出错则返回负数
  10. rv = printf("%d F is water's boiling point.\n", bph2o);
  11. printf("The printf() function printed %d characters.\n", rv);
  12.  
  13. system("pause");
  14. return 0;
  15. }


运行测试

1111.png


示例:打印较长的字符串

  1. #include <stdio.h>
  2. //argc: 参数个数 argv[]: 参数数组
  3. int main(int argc, char *argv[])
  4. {
  5. //可以在逗号处换行
  6. printf("string join %s",
  7. "!\n");
  8.  
  9. //方法一:用多个printf()来拼接字符串
  10. printf("Here's one way to print a ");
  11. printf("long string.\n");
  12. //方法二:用反斜杠来断行
  13. printf("Here's one way to print a \
  14. long string.\n");//这里必须从最左边开始,否则缩进也会成为字符串的一部分
  15. //方法三:""+空格+"" ANSI C引入的字符串连接
  16. printf("Here's one way to print a "
  17. "long string.\n");//ANSI C
  18. printf("Here's one way to print a " "long string.\n");
  19.  
  20. system("pause");
  21. return 0;
  22. }
运行测试
1111.png



标签: C语言

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号