一、汇总前面学过的格式控制符
格式控制符 | 说明 |
---|---|
%c | 输出一个单一的字符 |
%hd、%d、%ld | 以十进制、有符号的形式输出 short、int、long 类型的整数 |
%hu、%u、%lu | 以十进制、无符号的形式输出 short、int、long 类型的整数 |
%ho、%o、%lo | 以八进制、不带前缀、无符号的形式输出 short、int、long 类型的整数 |
%#ho、%#o、%#lo | 以八进制、带前缀、无符号的形式输出 short、int、long 类型的整数 |
%hx、%x、%lx %hX、%X、%lX |
以十六进制、不带前缀、无符号的形式输出 short、int、long 类型的整数。如果 x 小写,那么输出的十六进制数字也小写;如果 X 大写,那么输出的十六进制数字也大写。 |
%#hx、%#x、%#lx %#hX、%#X、%#lX |
以十六进制、带前缀、无符号的形式输出 short、int、long 类型的整数。如果 x 小写,那么输出的十六进制数字和前缀都小写;如果 X 大写,那么输出的十六进制数字和前缀都大写。 |
%f、%lf | 以十进制的形式输出 float、double 类型的小数 |
%e、%le %E、%lE |
以指数的形式输出 float、double 类型的小数。如果 e 小写,那么输出结果中的 e 也小写;如果 E 大写,那么输出结果中的 E 也大写。 |
%g、%lg %G、%lG |
以十进制和指数中较短的形式输出 float、double 类型的小数,并且小数部分的最后不会添加多余的 0。如果 g 小写,那么当以指数形式输出时 e 也小写;如果 G 大写,那么当以指数形式输出时 E 也大写。 |
%s | 输出一个字符串 |
二、printf用法
2.1 长度控制
(1)width表示最小输出宽度,'-'表示左对齐,不加是右对齐。
#include <stdio.h>
int main()
{
int a1=20, a2=345, a3=700, a4=22;
int b1=56720, b2=9999, b3=20098, b4=2;
int c1=233, c2=205, c3=1, c4=6666;
int d1=34, d2=0, d3=23, d4=23006783;
printf("%-9d %-9d %-9d %-9d\n", a1, a2, a3, a4);
printf("%-9d %-9d %-9d %-9d\n", b1, b2, b3, b4);
printf("%-9d %-9d %-9d %-9d\n", c1, c2, c3, c4);
printf("%-9d %-9d %-9d %-9d\n", d1, d2, d3, d4);
return 0;
}
m 是正数,以%+d
输出时要带上正号;n 是负数,以+d
输出时要带上负号。
m 是正数,以% d
输出时要在前面加空格;n 是负数,以% d
输出时要在前面加负号。
%.0f
表示保留 0 位小数,也就是只输出整数部分,不输出小数部分。默认情况下,这种输出形式是不带小数点的,但是如果有了#
标志,那么就要在整数的后面“硬加上”一个小数点,以和纯整数区分开。
#include <stdio.h>
int main(){
int m = 192, n = -943;
float f = 84.342;
printf("m=%10d, m=%-10d\n", m, m); //演示 - 的用法
printf("m=%+d, n=%+d\n", m, n); //演示 + 的用法
printf("m=% d, n=% d\n", m, n); //演示空格的用法
printf("f=%.0f, f=%#.0f\n", f, f); //演示#的用法
return 0;
}
输出结果:
m= 192, m=192 m=+192, n=-943 m= 192, n=-943 f=84, f=84.
(2)精度长度控制
.precision 表示输出精度,也就是小数的位数。
- 当小数部分的位数大于 precision 时,会按照四舍五入的原则丢掉多余的数字;
- 当小数部分的位数小于 precision 时,会在后面补 0。
另外,.precision 也可以用于整数和字符串,但是功能却是相反的:
- 用于整数时,.precision 表示最小输出宽度。与 width 不同的是,整数的宽度不足时会在左边补 0,而不是补空格。
- 用于字符串时,.precision 表示最大输出宽度,或者说截取字符串。当字符串的长度大于 precision 时,会截掉多余的字符;当字符串的长度小于 precision 时,.precision 就不再起作用。
#include <stdio.h>
int main(){
int n = 123456;
double f = 882.923672;
char *str = "abcdefghi";
printf("n: %.9d %.4d\n", n, n);
printf("f: %.2lf %.4lf %.10lf\n", f, f, f);
printf("str: %.5s %.15s\n", str, str);
return 0;
}
/*
运行结果:
n: 000123456 123456
f: 882.92 882.9237 882.9236720000
str: abcde abcdefghi
*/
关于printf()的输出,要注意一下缓冲区问题。
Linux和Mac OS下数据不直接输出,没有\n就先放到缓冲区,不显示,遇到\n显示,Windows下不是。
2.2 在屏幕的任何位置输出数据
光标定位需要使用 windows.h 头文件中的SetConsoleCursorPosition
函数,它的使用方式为:
SetConsoleCursorPosition(HANDLE hConsoleOutput, COORD dwCursorPosition);
hConsoleOutput
表示控制台缓冲区句柄,可通过GetStdHandle(STD_OUTPUT_HANDLE)
来获得;dwCursorPosition
是光标位置,也就是第几行第几列,它是 COORD 类型的结构体。
例如,将光标定位到控制台的第3行第3列:
#include <stdio.h>
#include <windows.h>
int main(){
//定义光标位置
COORD coord;
coord.X = 3; //第3行
coord.Y = 3; //第3列
//获取控制台缓冲区句柄
HANDLE ConsoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
//设置光标位置
SetConsoleCursorPosition(ConsoleHandle, coord);
printf("123");
return 0;
}
注意:窗口的左上角是第 0 行第 0 列,而不是我们通常所认为的第 1 行第 1 列。编程语言中的很多计数都是从 0 开始的,而不是从 1 开始。
搞定了光标重定位,你就可以将输出顺序打乱了,想在哪里输出就在哪里输出。例如:
#include <stdio.h>
#include <windows.h>
//设置光标位置
void setCursorPosition(int x, int y);
//设置文字颜色
void setColor(int color);
int main(){
setColor(3);
setCursorPosition(3, 3);
puts("★");
setColor(0XC);
setCursorPosition(1, 1);
puts("◆");
setColor(6);
setCursorPosition(6, 6);
puts("■");
return 0;
}
//自定义的光标定位函数
void setCursorPosition(int x, int y){
COORD coord;
coord.X = x;
coord.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
//自定义的文字颜色函数
void setColor(int color){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color) ;
}
运行结果:
三、输入用法
在C语言中,有多个函数可以从键盘获得用户输入:
- scanf():和 printf() 类似,scanf() 可以输入多种类型的数据。
- getchar()、getche()、getch():这三个函数都用于输入单个字符。
- gets():获取一行数据,并作为字符串处理。
scanf() 是最灵活、最复杂、最常用的输入函数,但它不能完全取代其他函数,大家都要有所了解。
3.1 scanf()函数
scanf格式化扫描输入。注意"%d %d"
之间是有空格的,所以输入数据时也要有空格。scanf() 对输入数据之间的空格的处理比较宽松,并不要求空格数严格对应,多几个少几个无所谓,只要有空格就行。。对于 scanf(),输入数据的格式要和控制字符串的格式保持一致。
%p
是一个新的格式控制符,它表示以十六进制的形式(带小写的前缀)输出数据的地址。如果写作%P
,那么十六进制的前缀也将变成大写形式。
#include <stdio.h>
int main()
{
int a='F';
int b=12;
int c=452;
printf("&a=%p, &b=%p, &c=%p\n", &a, &b, &c);
return 0;
}
注意一下这个代码及相对应的输入:
#include <stdio.h>
int main()
{
int a, b, c;
scanf("%d %d", &a, &b);
printf("a+b=%d\n", a+b);
scanf("%d %d", &a, &b);
printf("a+b=%d\n", a+b);
scanf("%d, %d, %d", &a, &b, &c);
printf("a+b+c=%d\n", a+b+c);
//划重点下面这部分。
scanf("%d is bigger than %d", &a, &b);
printf("a-b=%d\n", a-b);
return 0;
}
运行结果:
10 20↙ a+b=30 100 200↙ a+b=300 56,45,78↙ a+b+c=179 25 is bigger than 11↙ a-b=14