格式化输入输出函数
printf()
函数原型声明:int printf(const char *format, ...);
其中 format 用法:%[修饰符]输出格式字符
标准输出格式字符表:
格式字符 | 说明 |
---|---|
d ,i |
十进制整数 |
x ,X |
十六进制无符号整数 |
o |
八进制无符号整数 |
u |
无符号十进制整数 |
c |
单一字符 |
s |
字符串 |
e ,E |
指数形式浮点小数 |
f |
小数形式浮点小数 |
g |
自动选择 e 和 f 结果中较短的一种,且只保留有效数字 |
%% |
输出百分号本身 |
Example:
int num = 2233;
printf("DEC: num = %d
HEX: num = %x
OCT: num = %o
", num, num, num);
char ch = 120;
printf("Char: ch = %c
Str: %s
", ch, "ArchLinux");
float bi = 22.33;
printf("%%e: bi = %e
%%f: bi = %f
%%g: bi = %g
", bi, bi, bi);
上述代码输出结果:
DEC: num = 2233
HEX: num = 8b9
OCT: num = 4271
Char: ch = x
Str: ArchLinux
%e: bi = 2.233000e+001
%f: bi = 22.330000
%g: bi = 22.33
修饰符表
修饰符 | 功能 |
---|---|
m |
设置输出数据域宽,若数据长度 < m 左补空格,否则按实际输出 |
.n |
对于实数,指定小数点后位数(四舍五入); 对于字符串,指定实际输出位数 |
- |
输出的数据在域内左对齐(不加此修饰符则默认为右对齐) |
+ |
指定在有符号数的正数前显示正号 |
0 |
用于补齐的空格替换成 0 |
# |
在八进制数和十六进制数前显示前导 0 ,0x |
l |
在 d , o , x , u 前,指定输出精度为 long 型在 e , f , g 前,指定输出精度为 double 型 |
为防止数据溢出,可以在常量数据后面添加字母来指定数据类型,比如 12L
表示 long 类型的 12
宏定义一年的秒数,这个数肯定很大,防止溢出,可以写作:
#define SEC_YEAR (60LL*60LL*24LL*365LL)
下列语句可以输出该语句所在的函数以及在文件中的行号:
printf("[%s:%d]
", __FUNCTION__, __LINE__);
scanf()
函数原型声明:int scanf(const char *format, ...);
用 scanf()
接收字符串要注意不能有空格。字符串相关操作最好使用专门的字符串函数。
scanf() 返回值:返回正确接收到的数据个数。Upon successful return, these functions return the number of characters printed (not including the trailing ' ' used to end output to strings).
当多个输入放在一起用时,可能会出现意想不到的结果,比如:
scanf("%d", &i);
scanf("%c", &ch);
printf("i = %d, ch = %d
", i, ch); // ch = 10, ASCII 10 = LF
当输入 i 的值按回车之后,所有的输入都结束了,ch 输出为 10,这是因为 ch 获得了换行符,换行符的 ASCII 码为 10。可以用抑制符解决这个问题:
scanf("%d", &i);
scanf("%*c%c", &ch);