0%

printf格式化输出

格式输出控制符

printf的格式控制的完整格式:% - 0 m.n lh:

  1. %:格式说明的起始符号,不可缺少。
  2. -: 有-表示左对齐输出,如省略表示右对齐输出。
  3. 0:有0表示指定空位填0,如省略表示指定空位不填。
  4. m.n:m指域宽,即对应的输出项在输出设备上所占的字符数。n指精度,用于说明输出的实型数的小数位数。未指定n时,隐含的精度为n=6位。
    针对字符输出,%m.ns:输出占m列,但只取字符串中左端n个字符。
  5. l:l对整型指long型,对实型指double型。
  6. h:用于将整型的格式字符修正为short型。

格式输出数据类型控制

  1. d格式:用来输出十进制整数。%ld:输出长整型数据。%md:m为指定的输出字段的宽度。
  2. o格式:以无符号八进制形式输出整数。对长整型可以用”%lo”格式输出。同样也可以指定字段宽度用“%mo”格式输出。
  3. x格式:以无符号十六进制形式输出整数。对长整型可以用”%lx”格式输出。同样也可以指定字段宽度用”%mx”格式输出。
  4. u格式:以无符号十进制形式输出整数。对长整型可以用”%lu”格式输出。同样也可以指定字段宽度用“%mu”格式输出。
  5. c格式:输出一个字符。
  6. s格式:用来输出一个字符串
  7. f格式:用来输出实数(包括单、双精度),以小数形式输出。
  8. e格式:以指数形式输出实数。
  9. g格式:自动选f格式或e格式中较短的一种输出,且不输出无意义的零。

m.n格式另一种表述

对于m.n的格式还可以用如下方法表示:

printf(“%*.*s\n”,m,n,ch);

前边的*定义的是总的宽度,后边的定义的是输出的个数。
分别对应外面的参数m和n 。
这种方法的好处是可以在语句之外对参数m和n赋值,从而控制输出格式。

例如:函数接口传给你一个没有“\0”结尾的字符串str和他的长度str_len,调试的时候你需要将其打印出来。

printf("%.*s\n", str_len, str);

printf输出字符串长度

输出格式 %n 可以将所输出字符串的长度值赋绐一个变量:

int slen;
printf(“hello world%n”, &slen);

执行后变量slen被赋值为11。

输出颜色

printf("\033[31m test print color \033[0m\n");

示例

printf("%3s, \n%7.2s, \n%.4s, \n%-5.3s\n", "PRINTF", "PRINTF", "PRINTF", "PRINTF");
gcc main.c
./a.out
PRINTF, 
     PR, 
PRIN, 
PRI  

解析如下:

  1. %s原样输出字符串: %s
  2. %ns输出指定长度n的字符串, 超长时不截断, 不足时右对齐: %3s
  3. %m.ns输出指定长度的字符串, 超长时截断, 不足时右对齐,m为最终的字符串输出长度,n为从参数字符串中取出的子串长度: %7.2s
  4. %.ns输出指定长度的字符串, 超长时截断,不足时右对齐: %.4s; 如果使用 %.8s 与%s %3s效果一样
  5. %-m.ns输出指定长度的字符串, 超长时截断, 不足时左对齐: %-5.3s

通过上述用例,所谓超长时截断用到的n并不是只在超长时才起作用,而是不管你有没有超长,都必须截取这么长。
上述m,n是可以动态指定的,方法是用*代替m或者n,然后在参数列表里加上一个数字参数