免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 421 | 回复: 0
打印 上一主题 下一主题

[文本处理] C ++ shell --printf [复制链接]

论坛徽章:
6
程序设计版块每日发帖之星
日期:2016-05-11 06:20:00操作系统版块每日发帖之星
日期:2016-05-12 06:20:00每日论坛发贴之星
日期:2016-05-12 06:20:00操作系统版块每日发帖之星
日期:2016-05-14 06:20:00程序设计版块每日发帖之星
日期:2016-05-31 06:20:00每日论坛发贴之星
日期:2016-05-31 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-09-05 07:59 |只看该作者 |倒序浏览
  1. C中格式字符串的一般形式为: %[标志][输出最小宽度][.精度][长度]类型, 其中方括号[]中的
  2. 项为可选项。各项的意义介绍如下:
  3. 1.类型类型字符用以表示输出数据的类型,其格式符和意义下表所示:表示输出类型的格式字符 格式字符意义
  4. %a                              浮点数、十六进制数字和p-计数法(C99)
  5. %A                              浮点数、十六进制数字和p-计数法(C99)
  6. %c                              输出单个字符
  7. %d                              以十进制形式输出带符号整数(正数不输出符号)
  8. %e                              以指数形式输出单、双精度实数
  9. %E                              以指数形式输出单、双精度实数
  10. %f                              以小数形式输出单、双精度实数
  11. %g                              以%f%e中较短的输出宽度输出单.双精度实数,%e格式在指数小于-4或者大于等于精度时使用
  12. %G                              以%f%e中较短的输出宽度输出单.双精度实数,%e格式在指数小于-4或者大于等于精度时使用
  13. %i                              有符号十进制整数(与%d相同)
  14. %o                              以八进制形式输出无符号整数(不输出前缀O)
  15. %p                               指针%s 输出字符串
  16. %x            以十六进制形式输出无符号整数(不输出前缀OX)
  17. %X            以十六进制形式输出无符号整数(不输出前缀OX)
  18. %u            以十进制形式输出无符号整数

  19. /*   测试常见的输出类型   */
  20. #include "stdio.h"
  21. #include "conio.h"
  22. main()
  23. {     
  24. printf("The program test print style!\n");
  25.      /*   以十进制形式输出带符号整数(正数不输出符号)   */
  26.      printf("%d\n" , 223);
  27.      printf("%d\n" , -232);
  28.      printf("\n");
  29.      /*   以八进制形式输出无符号整数(不输出前缀O)   */
  30.      printf("%o\n" , 223);
  31.      printf("%o\n" , -232);
  32.      printf("\n");     /*
  33. 以十六进制形式输出无符号整数(不输出前缀OX)   */
  34.      printf("%x\n" , 223);
  35.      printf("%x\n" , -232);
  36.      printf("\n");     /*
  37. 以十进制形式输出无符号整数   */
  38.      printf("%u\n" , 223);
  39.      printf("%u\n" , -232);
  40.      printf("\n");     /*
  41. 以小数形式输出单、双精度实数   */
  42.      printf("%f\n" , 223.11);
  43.      printf("%f\n" , 232.11111111);
  44.      printf("%f\n" , -223.11);
  45.      printf("%f\n" , -232.11111111);
  46.      printf("\n");     /*
  47. 以指数形式输出单、双精度实数   */
  48.      printf("%e\n" , 223.11);
  49.      printf("%e\n" , 232.11111111);
  50.      printf("%e\n" , -223.11);
  51.      printf("%e\n" , -232.11111111);
  52.      printf("\n");     
  53. /*   以%f%e中较短的输出宽度输出单、双精度实数   */
  54.      printf("%g\n" , 223.11);
  55.      printf("%g\n" , 232.111111111111);
  56.      printf("%g\n" , -223.11);
  57.      printf("%g\n" , -232.111111111111);
  58.      printf("\n");     
  59. /*   输出单个字符   */
  60.      printf("%c\n" , 'a');
  61.      printf("%c\n" , 97);
  62.      printf("\n");     
  63. /*   输出单个字符   */
  64.      printf("%s\n" , "this is a test!");
  65.      printf("%s\n" , "2342o34uo23u");
  66.      printf("\n");
  67.      getch();
  68. }
  69. 2.标志标志字符为-、+、#、空格和0五种,其意义下表所示:
  70. 标志格式字符      标 志 意 义
  71. -           结果左对齐,右边填空格
  72. +           输出符号(正号或负号)
  73. 空格                 输出值为正时冠以空格,为负时冠以负号
  74. #          对c,s,d,u类无影响;对o类,在输出时加前缀0;对x类,
  75.                                          在输出时加前缀0x或者0X;对g,G 类防止尾随0被删除;
  76.                                          对于所有的浮点形式,#保证了即使不跟任何数字,也打印一个小数点字符
  77. 0                                        对于所有的数字格式,用前导0填充字段宽度,若出现-标志或者指定了精度(对于整数),忽略
  78. 3.输出最小宽度用十进制整数来表示输出的最少位数。若实际位数多于定义的宽度,则按实际位数输出,若实际位数少于定义的宽度则补以空格或0。
  79. /*   测试标志字符为-、+、#、空格四种   */
  80. #include "stdio.h"
  81. #include "conio.h"
  82. main()
  83. {
  84.        /*   以十进制形式输出带符号整数(正数不输出符号)   */
  85.            printf("*%-10d*\n", 223);
  86.            printf("*%+10d*\n" , -232);
  87.            printf("*%2d*\n" , 223);
  88.            printf("*%#d*\n" , -232);
  89.            printf("\n");     getch();
  90.            /*   以八进制形式输出无符号整数(不输出前缀O)   */
  91.            printf("*%-10o*\n" , 223);
  92.            printf("*%+10o*\n" , -232);
  93.            printf("*%o*\n" , 223);
  94.            printf("*%#o*\n" , -232);
  95.            printf("\n");
  96.            getch();
  97.            /*   以十六进制形式输出无符号整数(不输出前缀OX)   */
  98.            printf("$%-10x$\n" , 223);
  99.            printf("$%010x$\n" , -232);
  100.            printf("$% x$\n" , 223);
  101.            printf("$%#x$\n" , -232);
  102.            printf("\n");
  103.            /*   以十进制形式输出无符号整数   */
  104.            printf("%-10u\n" , 223);
  105.            printf("%+10u\n" , -232);
  106.            printf("% u\n" , 223);
  107.            printf("%#u\n" , -232);
  108.            printf("\n");
  109.            getch();
  110.            /*   以小数形式输出单、双精度实数   */
  111.            printf("%-10f\n" , 223.11);
  112.            printf("%+10f\n" , 232.11111111);
  113.            printf("% f\n" , -223.11);
  114.            printf("%#f\n" , -232.11111111);
  115.            printf("\n");
  116.            getch();
  117.        
  118.         /*   以指数形式输出单、双精度实数   */
  119.         printf("%-10e\n" , 223.11);
  120.         printf("%+10e\n" , 232.11111111);
  121.         printf("% e\n" , -223.11);
  122.         printf("%#e\n" , -232.11111111);
  123.         printf("\n");
  124.         getch();
  125.         /*   以%f%e中较短的输出宽度输出单、双精度实数   */
  126.         printf("%-10g\n" , 223.11);
  127.         printf("%+10g\n" , 232.111111111111);
  128.         printf("% g\n" , -223.11);
  129.         printf("%#g\n" , -232.111111111111);
  130.         printf("\n");
  131.         getch();
  132.         /*   输出单个字符   */
  133.         printf("%-10c\n" , 'a');
  134.         printf("%+10c\n" , 97);
  135.         printf("% c\n" , 'a');
  136.         printf("%#c\n" , 97);
  137.         printf("\n");
  138.         getch();
  139.         /*   输出单个字符   */
  140.         printf("%-20s\n" , "this is a test!");
  141.         printf("%+20s\n" , "2342o34uo23u");
  142.         printf("% 20s\n" , "this is a test!");
  143.         /* 不足补空格 */
  144.         printf("%#s\n" , "2342o34uo23u");
  145.         printf("\n");
  146.         getch();
  147.        
  148.         }
  149. 4.精度
  150.   精度格式符以“.”开头,后跟十进制整数。本项的意义是:如果输出数字,则表示小数的位数;如果输出的是字符,则表示输出字符的个数;若实
  151. 际位数大于所定义的精度数,则截去超过的部分。
  152. /*   测试精度   */
  153. #include "stdio.h"
  154. #include "conio.h"
  155. main()
  156. {
  157.      printf("%.3d\n" , 5555);
  158.      getch();
  159.      printf("%.3f\n" , 0.88888);
  160.      getch();
  161.      printf("%.3f\n" , 0.9999);
  162.      getch();
  163.      printf("%.4s\n" , "this is a test!");
  164.      getch();
  165.          }
  166. 5.长度长度格式符为h,l两种,h表示按短整型量输出,l表示按长整型量输出。
  167.      h和整数转换说明符一起使用,表示一个short   int 或者unsigned short int类型的数值 ,
  168. 示例:%hu,%hx,%6.4hd
  169.      hh和整数转换说明符一起使用,表示一个short   int 或者unsigned
  170. short类型的数值 ,
  171. 示例:%hhu,%hhx,%6.4hhd
  172.      j和整数转换说明符一起使用,表示一个intmax_t或者uintmax_t类型的数值 ,
  173. 示例:%jd,%8jx     
  174. l和整数转换说明符一起使用,表示一个longint 或者unsigned long int类型的数值 ,示例:%ld,%8lu
  175.      ll和整数转换说明符一起使用,表示一个longint 或者unsigned long int类型的数值 (C99),
  176. 示例:%lld,%8llu
  177.      L和浮点转换说明符一起使用,表示一个long double的值,
  178. 示例:%Lf,%10.4Le     
  179. t和整数转换说明符一起使用,表示一个ptrdiff_t值(两个指针之间的差相对应的类型)(C99),示例:%td,%12ti     
  180. z和整数转换说明符一起使用,表示一个size_t值(sizeof返回的类型)(C99),示例:%zd,%12zx

  181. main(){
  182. int a=15;
  183. float b=138.3576278;
  184. double c=35648256.3645687;
  185. char d='p';
  186. printf("a=%d,%5d,%o,%x\n",a,a,a,a);
  187. printf("b=%f,%lf,%5.4lf,%e\n",b,b,b,b);
  188. printf("c=%lf,%f,%8.4lf\n",c,c,c);
  189. printf("d=%c,%8c\n",d,d);
  190. }
  191. a<--15
  192. b<--138.3576278
  193. c<--35648256.3645687
  194. d<--'p'
  195. main()
  196. {
  197.      int a=29;
  198.      float b=1243.2341;
  199.      double c=24212345.24232;
  200.      char d='h';
  201.      printf("a=%d,%5d,%o,%x\n",a,a,a,a);
  202.          /* 其中“%f”和“%lf ”格式的输出相同,说明“l”符对“f”类型无影响
  203.          * “%5.4lf”指定输出宽度为5,精度为4,由于实际长度超过5故应该按实际位数输出,小数位数超过4位        *   部分被截去
  204.          */
  205.      printf("b=%f,%lf,%5.4lf,%e\n",b,b,b,b);
  206.          /* 输出双精度实数,“%8.4lf ”由于指定精度为4位故截去了超过4位的部分 */
  207.      printf("c=%lf,%f,%8.4lf\n",c,c,c);
  208.          /* 输出字符量d,其中“%8c ”指定输出宽度为8故在输出字符p之前补加7个空格 */
  209.      printf("d=%c,%8c\n",d,d);
  210.      getch();
  211.          }
  212.          使用printf函数时还要注意一个问题,那就是输出表列中的求值顺序。不同的编译系统不一定相同,可以从左到右,也可从右到左。Turbo
  213. C是按从右到左进行的
  214. main(){
  215. int i=8;
  216. printf("%d\n%d\n%d\n%d\n%d\n",++i,--i,i--,i++,-i--);
  217. }
  218. 6.特殊用法对于m.n的格式还可以用如下方法表示
  219. (例)char ch[20];
  220. printf("%*.*s\n",m,n,ch);
  221. 前边的*定义的是总的宽度,后边的定义的是输出的个数。分别对应外面的参数m和n
  222. 。我想这种方法的好处是可以在语句之外对参数m和n赋值,从而控制输出格式。
  223. 今天(06.6.9)又看到一种输出格式 %n 可以将所输出字符串的长度值赋绐一个变量, 见下例:
  224. int slen;printf("hello world%n", &slen);
  225. 执行后变量被赋值为11。
  226. 又查了一下, 看到一篇文章(查看)说这种格式输出已经确认为一个安全隐患,并且已禁用。
  227. 再搜搜果然这种用法都被用来搞什么溢出、漏洞之类的,随便找了一个:格式化字符
  228. 串攻击笔记特别注意下%*.*s这种用法pr
复制代码


您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP