printf()调用格式: printf("<格式化字符串>", <参量表>);
printf可以说是学习C语言最先接触的一个库函数,大家也肯定知道它的作用就是用来打印,其实它有很多功能。
目录
一.打印字符串
直接打印字符串,这是最基础的使用方法,就像我们学习的第一个hello world就是最好的例子。
printf("Hello World!\n");
char str[20] = "Hello World!\n";
printf(str);
二.打印参数
printf()可以打印整型,浮点型,字符和字符串参数,可以选择八进制/十进制/十六进制打印整型。
各数据类型与格式字符的对应关系:
%d,%i 十进制有符号整数,适用于 int; short; char;
%u 十进制无符号整数,适用于 unsigned int; unsigned short; unsigned char;
%hd 十进制有符号短整数,适用于 short; char;
%hu 十进制有符号短整数,适用于 unsigned short; unsigned char;
%ld 十进制有符号长整数,适用于 long;
%lu 十进制有符号长整数,适用于 unsigned long;
%lld 十进制有符号长长整数,适用于 long long;
%llu 十进制有符号长长整数,适用于 unsigned long long;
%c 单字符,适用于 char;
%s 字符串,适用于 char *;
%f,%lf 浮点数,适用于 float; double;
%e,%E 指数形式的浮点数,适用于 float; double;
%p 指针的值,适用于所有指针类型;
%x,%X 无符号以十六进制表示的整数,适用于所有整型;
%o 无符号以八进制表示的整数,适用于所有整型;
%g,%G 浮点数,不显示无意义的0,适用于 float; double;
%% "%",因为%表示格式打印的开头,所以用两个%号表示一个%.
三.转义字符表
转义字符主要用来表示那些不能显示的ASCII字符,所有的ASCll码都可以用“\”加数字(一般是8进制数字)来表示。
所有的转义字符和所对应的意义:
转义字符 | 意义 | ASCII码值(十进制) |
\a | 响铃(BEL) | 007 |
\b | 退格(BS) ,将当前位置移到前一列 | 008 |
\e | 控制符(esc),表示其后面是控制命令 | 033 |
\f | 换页(FF),将当前位置移到下页开头 | 012 |
\n | 换行(LF) ,将当前位置移到下一行开头 | 010 |
\r | 回车(CR) ,将当前位置移到本行开头 | 013 |
\t | 水平制表(HT) (跳到下一个TAB位置) | 009 |
\v | 垂直制表(VT) | 011 |
\\ | 代表一个反斜线字符''\' | 092 |
\' | 代表一个单引号(撇号)字符 | 039 |
\" | 代表一个双引号字符 | 034 |
\? | 代表一个问号 | 063 |
\0 | 空字符(NUL) | 000 |
\ddd | 1到3位八进制数所代表的任意字符 | 三位八进制 |
\xhh | 1到2位十六进制所代表的任意字符 | 二位十六进制 |
ASCll码表:
四.格式化输出参数
但打印不整齐时,我们可以使用格式化打印进行对其。其的格式是:
%[标志][输出最小宽度][.精度][长度]格式字符
e.g. "%7.2s", 输入"MAKEFILE", 输出" MA";
- 标志字符为-、+、#、空格和0五种,其意义下表所示:
标志字符表 标志字符 标 志 意 义 - 结果左对齐,与最小宽度一起使用,默认右对齐,可以与‘+’, 空格, '#'一起使用。 + 输出值为正时冠以正号,不适用于c,s类型,可以与‘-’, '0'一起使用。 空格 输出值为正时冠以空格,不适用于c,s类型,可以与‘-’, '0'一起使用。 # 不适用于c,s,d,u类型,不影响运行但会有编译告警;
对o类,在输出时加前缀0;
对x类,在输出时加前缀0x或者0X;
对g,G 类防止尾随0被删除;
对于所有的浮点形式,#保证了即使不跟任何数字,也打印一个小数点字符;
可以与‘-’, '0'一起使用。
0 不适用于c,s类型,
对于所有的数字格式,用前导填充0,和最小宽度一起使用才有意义 。
可以与‘+’, 空格, '#'一起使用。
- 输出最小宽度,用十进制整数来表示输出的最少位数。若实际位数多于定义的宽度,则按实际位数输出,若实际位数少于定义的宽度则补以空格或0。
- 精度,精度格式符以“.”开头,后跟十进制整数。意义是:如果输出浮点数,则表示小数的位数;如果输出是字符,则表示输出字符的个数;若实际位数大于所定义的精度数,则截去超过的部分。
- 长度,长度格式符为h,l两种,h表示按短整型量输出,l表示按长整型量输出。
- 格式字符已经在上面介绍过了。
e.g: 整型类型格式化打印实验用例:
#include <stdio.h>
int main()
{
int a = 0;
printf("input a=");
while(scanf("%d", &a))
{
printf("a<%%d >=<%d>\n", a);
printf("a<%%9d >=<%9d>\n", a);
printf("a<%%-d >=<%-d>\n", a); /* -左对齐只有在给出最小宽度时才有意义 */
printf("a<%%-9d >=<%-9d>\n", a);
printf("a<%%+d >=<%+d>\n", a);
printf("a<%% d >=<% d>\n", a);
printf("a<%%+9d >=<%+9d>\n", a);
printf("a<%% 9d >=<% 9d>\n", a);
printf("a<%%-+9d >=<%-+9d>\n", a);
printf("a<%% -9d >=<% -9d>\n", a);
/*printf("a<%% d>=<% d>\n", a);*/ /* 会产生告警,运行效果和"% d"一样 */
printf("a<%%0d >=<%0d>\n", a); /* 0补0只有在给出最小宽度时才有意义 */
printf("a<%%09d >=<%09d>\n", a);
printf("a<%%+09d >=<%+09d>\n", a);
printf("a<%% 09d >=<% 09d>\n", a);
/*printf("a<%%#d >=<%#d>\n", a);*/ /* 会产生告警,运行效果和不加#是一样的 */
printf("a<%%#o >=<%#o>\n", a);
printf("a<%%#x >=<%#x>\n", a);
printf("a<%%#15X >=<%#15X>\n", a);
printf("a<%%-#15X>=<%-#15X>\n", a);
printf("a<%%0#15X>=<%0#15X>\n", a);
printf("\ninput a=");
}
printf("\n");
return 0;
}
运行结果:
input a=100
a<%d >=<100>
a<%9d >=< 100>
a<%-d >=<100>
a<%-9d >=<100 >
a<%+d >=<+100>
a<% d >=< 100>
a<%+9d >=< +100>
a<% 9d >=< 100>
a<%-+9d >=<+100 >
a<% -9d >=< 100 >
a<%0d >=<100>
a<%09d >=<000000100>
a<%+09d >=<+00000100>
a<% 09d >=< 00000100>
a<%#o >=<0144>
a<%#x >=<0x64>
a<%#15X >=< 0X64>
a<%-#15X>=<0X64 >
a<%0#15X>=<0X0000000000064>
e.g: 浮点类型格式化打印实验用例:
#include <stdio.h>
int main()
{
double a = 0;
printf("input a=");
while(scanf("%lf", &a))
{
printf("a<%%f >=<%f>\n", a);
printf("a<%%lf >=<%lf>\n", a);
printf("a<%%g >=<%g>\n", a);
printf("a<%%15f >=<%15f>\n", a);
printf("a<%%15.3f>=<%15.3f>\n", a);
printf("a<%%.3f >=<%.3f>\n", a);
printf("a<%%-f >=<%-f>\n", a); /* -左对齐只有在给出最小宽度时才有意义 */
printf("a<%%-15f >=<%-15f>\n", a);
printf("a<%%+f >=<%+f>\n", a);
printf("a<%% f >=<% f>\n", a);
printf("a<%%+15f >=<%+15f>\n", a);
printf("a<%% 15f >=<% 15f>\n", a);
printf("a<%%-+15f>=<%-+15f>\n", a);
printf("a<%% -15f>=<% -15f>\n", a);
printf("a<%%0f >=<%0f>\n", a); /* 0补0只有在给出最小宽度时才有意义 */
printf("a<%%015f >=<%015f>\n", a);
printf("a<%%+015f>=<%+015f>\n", a);
printf("a<%% 015f>=<% 015f>\n", a);
printf("a<%%#f >=<%#f>\n", a);
printf("a<%%#g >=<%#g>\n", a);
printf("a<%%#15f >=<%#15f>\n", a);
printf("a<%%-#15f>=<%-#15f>\n", a);
printf("a<%%0#15f>=<%0#15f>\n", a);
printf("\ninput a=");
}
printf("\n");
return 0;
}
运行结果:
input a=1.1
a<%f >=<1.100000>
a<%lf >=<1.100000>
a<%g >=<1.1>
a<%15f >=< 1.100000>
a<%15.3f>=< 1.100>
a<%.3f >=<1.100>
a<%-f >=<1.100000>
a<%-15f >=<1.100000 >
a<%+f >=<+1.100000>
a<% f >=< 1.100000>
a<%+15f >=< +1.100000>
a<% 15f >=< 1.100000>
a<%-+15f>=<+1.100000 >
a<% -15f>=< 1.100000 >
a<%0f >=<1.100000>
a<%015f >=<00000001.100000>
a<%+015f>=<+0000001.100000>
a<% 015f>=< 0000001.100000>
a<%#f >=<1.100000>
a<%#g >=<1.10000>
a<%#15f >=< 1.100000>
a<%-#15f>=<1.100000 >
a<%0#15f>=<00000001.100000>
input a=q
e.g: 字符串格式化打印实验用例:
#include <stdio.h>
int main()
{
char a[20] = "hello world!";
printf("input a=");
scanf("%19s", a);
printf("a<%%s >=<%s>\n", a);
printf("a<%%15s >=<%15s>\n", a);
printf("a<%%15.3s >=<%15.3s>\n", a);
printf("a<%%.3s >=<%.3s>\n", a);
printf("a<%%-s >=<%-s>\n", a); /* -左对齐只有在给出最小宽度时才有意义 */
printf("a<%%-15s >=<%-15s>\n", a);
printf("a<%%-15.3s>=<%-15.3s>\n", a);
printf("\n");
return 0;
}
运行结果:
input a=linux
a<%s >=<linux>
a<%15s >=< linux>
a<%15.3s >=< lin>
a<%.3s >=<lin>
a<%-s >=<linux>
a<%-15s >=<linux >
a<%-15.3s>=<lin >
五.打印颜色控制
- /033[30m -- /033[37m 设置前景色
- /033[40m -- /033[47m 设置背景色
黑 | 红 | 绿 | 黄 | 蓝 | 紫 | 深绿 | 白色 | |
字体色 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 |
背景色 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 |
六.光标控制
- /033[nA 光标上移n行
- /033[nB 光标下移n行
- /033[nC 光标右移n行
- /033[nD 光标左移n行
- /033[y;xH 设置光标位置
- /033[2J 清屏
- /033[K 清除从光标到行尾的内容
- /033[s 保存光标位置
- /033[u 恢复光标位置
- /033[?25l 隐藏光标
- /033[?25h 显示光标
- /033[0m 关闭所有属性
- /033[1m 设置高亮度
- /033[4m 下划线
- /033[5m 闪烁
- /033[7m 反显
- /033[8m 消隐
e.g:
#include <stdio.h>
#define NONE "\e[0m"
#define BLACK "\e[0;30m"
#define L_BLACK "\e[1;30m"
#define RED "\e[0;31m"
#define L_RED "\e[1;31m"
#define GREEN "\e[0;32m"
#define L_GREEN "\e[1;32m"
#define BROWN "\e[0;33m"
#define YELLOW "\e[1;33m"
#define BLUE "\e[0;34m"
#define L_BLUE "\e[1;34m"
#define PURPLE "\e[0;35m"
#define L_PURPLE "\e[1;35m"
#define CYAN "\e[0;36m"
#define L_CYAN "\e[1;36m"
#define GRAY "\e[0;37m"
#define WHITE "\e[1;37m"
#define BG_BLACK "\e[40m"
#define BG_RED "\e[41m"
#define BG_GREEN "\e[42m"
#define BG_YELLOW "\e[43m"
#define BG_BLUE "\e[44m"
#define BG_PURPLE "\e[45m"
#define BG_CYAN "\e[46m"
#define BG_WHITE "\e[47m"
#define BOLD "\e[1m"
#define UNDERLINE "\e[4m"
#define BLINK "\e[5m"
#define REVERSE "\e[7m"
#define HIDE "\e[8m"
#define CLEAR "\e[2J"
#define CLRLINE "\r\e[K"
int main()
{
printf("---------------字体颜色控制----------------\n");
printf(BLACK BG_WHITE "BLACK " NONE L_BLACK "L_BLACK\n" NONE);
printf(RED "RED " L_RED "L_RED\n" NONE);
printf(GREEN "GREEN " L_GREEN "L_GREEN\n" NONE);
printf(BROWN "BROWN " YELLOW "YELLOW\n" NONE);
printf(BLUE "BLUE " L_BLUE "L_BLUE\n" NONE);
printf(PURPLE "PURPLE " L_PURPLE "L_PURPLE\n" NONE);
printf(CYAN "CYAN " L_CYAN "L_CYAN\n" NONE);
printf(GRAY "GRAY " WHITE "WHITE\n" NONE);
printf("---------------背景颜色控制----------------\n");
printf(BG_BLACK "BG_BLACK " NONE "\n");
printf(BG_RED "BG_RED " NONE "\n");
printf(BG_GREEN "BG_GREEN " NONE "\n");
printf(BG_YELLOW "BG_YELLOW " NONE "\n");
printf(BG_BLUE "BG_BLUE " NONE "\n");
printf(BG_PURPLE "BG_PURPLE " NONE "\n");
printf(BG_CYAN "BG_CYAN " NONE "\n");
printf(BG_WHITE "BG_WHITE " NONE "\n");
printf("\n");
return 0;
}
运行结果: