printf更高级的输出
格式字符
格式字符 | 作用 | 举例 |
%d | 代替一个整数 | printf("%d",1) |
%x | 输出一个十六进制数 | printf("%x",12) ,输出C |
%c | 代替一个字符 | printf("%c",'a') |
%p | 代替一个地址 | printf("%p",&p) |
%s | 代替一个字符串 | printf("%s","123") |
%f | 代替一个六位小数 | printf("%f",1.2) 输出1.200000 |
转义字符(个人认为比较常用的且必须知道的)
为了输出有含义的字符,就需要用到转义字符
字符转义
转义字符 | 输 出 结 果(控制台输出的) |
\n | 换行 |
\r | 光标移到这行开头,再输入会覆盖hello world |
%% | 50% |
\b | 退格符 |
\a | 警告字符,蜂鸣 |
\\ | 用于表示一个反斜杠,防止它被解释为一个转义序列符 |
\? | 在书写连续多个问号时使用,防止他们被解析成三字母词 |
\' | 用于表示字符常量' |
\" | 用于表示一个字符串内部的双引号 |
例如:打印一个 "\t"
代码则为:
int main()
{
printf("\\t");
return 0;
}
若不加'\',代码改为
printf("\t");
结果为:
实则就是打印了一个空格
数字转义
\ddd | ddd表示1~3个八进制的数字。 如: \130 | 输出X |
\xdd | dd表示2个十六进制数字。 如: \x30 | 输出0 |
为什么?
对于八进制数130————转化为十进制 :0*1+3*8+1*64=88
十进制88对应的ASCII码值就为字符X
相同的 ,十六进制数\x30对应的十进制————0*16+3*16=48
十进制48对应的ASCII码值就为0
举个例子
对于这条语句,结果为14 '\62' '\t'均为一个字符
1:c | 2.: | 3.\t | 4.e | 5.s | 6.t | 7.\62 | 8.8 | 9.\t | 10.e |
11.s | 12.t | 13. . | 14.c |
格式修饰符(常用的)
%ld | 输出长整型数据。 |
%md | m 为指定的输出字段的宽度。如果数据的位数小于 m,则左端补以空格,若大于 m,则按实际位数输出。 |
%.mf | 输出实数时小数点后保留 m 位 |
%nd | 限制输出的宽度 右对齐,左补空格 ————%10d 输出" 123" |
%-nd | 限制输出的宽度 左对齐,右补空格 ———— %-10d 输出"123 " |
%m.nd | 在限制输出的宽度的同时,保留n个小数 |
%0md | 在不满足位宽的地方补足0 |
拿一道题(出自牛客网 编程初学者入门——BC13——输出输入出生日期)
现在仅看输出部分
现在想要输出month和date,若为个位数,则需要加上0
那该怎么加?单纯加0会使十位数也会有0————限制宽度为2
那代码为
int main()
{
int a, b, c;
scanf("%4d %2d %2d", &a, &b, &c);
printf("year=%d\n", a);
printf("month=%2d\n", b);
printf("date=%2d\n", c);
return 0;
}
输出为
这是为什么? %2d 右对齐,宽度为2,不满足则默认为空格
此时需要加上0———%02d
printf("month=%02d\n", b);
printf("date=%02d\n", c);
scanf更高级的输入
位宽
现在假如我想只取别人输入的前m个要怎么办呢?
同样可以加一个数字控制位宽
scanf("%md" , &b);
控制输出
那假如我想一次读取两个数字呢?
scanf("%d%d" , &a , &b);
假如我输入的是一个时间,比如12:30,那我要怎么读取12和30呢?
scanf("%d:%d" , &a , &b);
但是,若不知道输入的格式该怎么办?
可以在中间加上 %*1c ,表示不读取1个%c,也就是不读取一个字符
scanf("%d%*1c%d", &a , &b);//无论输入1.30 还是1:30 读取的都是12和30两个数
如果想读取中间的字符该怎么办?
int a,c;
char b;
scanf("%d%c%d" , &a , &b , &c);
scanf读取%c会出现的问题
有一个程序
int a,c;
char b;
scanf("%d", &a);
scanf("%c", &b);
scanf("%d", &c);
printf("%d%c%d", a,b,c);
但是输出后b消失了!这是为什么?
\n也是一个字符,在每次输出后可能会下意识的按回车进入下一个输入,因此b被读取为回车
怎么解决?——用getchar 将回车读取走
int a,c;
char b;
scanf("%d", &a);
getchar();
scanf("%c", &b);
scanf("%d", &c);
printf("%d%c%d", a,b,c);
现在又再次用牛客那道题
此次看输入,仅输入一个数就可以读出三个数
用%md
scanf("%4d %2d %2d",&a,&b,&c);
代表输入一串数,a仅读取前4位,b接着读取2位,c接着读取2位
现在我们拿一道的题目
(来自牛客网——编程初学者入门训练————BC42.小乐乐定闹钟)
用上述知识 输入:
scanf("%d:%d %d",&h,&m,&s);
输出,需要打印时间,域宽为2,不满足位宽就打印0
printf("%02d:%02d",h,m);
2023.1.09 以上为萌新见解,认为是比较常用到的(可能是做题少了),有不对的地方请各位大佬指出