1.printf
(1)转换说明符
转换说明符号 | 输出 |
%a | 浮点数、十六进制数和p计数法 |
%A | 浮点数、十六进制数和p计数法 |
%c | 单个字符 |
%d | 有符号十进制整数 |
%e | 浮点数,e计数法(小写e) |
%E | 浮点数,e计数法(大写E) |
%f | 浮点数,十进制 |
%g | 自动选择%f,%e。%e用于指数小于-4或者大于或等于精度时 |
%G | 自动选择%f,%E。%E用于指数小于-4或者大于或等于精度时 |
%i | 有符号十进制整数(%d相同) |
%o | 无符号8进制数(不显示前缀0) |
%p | 指针 |
%s | 字符串 |
%u | 无符号十进制整数 |
%x | 无符号十六进制整数(字母小写)(不显示前缀0x) |
%X | 无符号十六进制整数(字母大写)(不显示前缀0x) |
%% | 打印一个%符号 |
(2)转换说明符修饰符
在%和转换字符之间可以插入修饰字符
修饰符 | 含义 |
标记 | 五种标记(+,-,空格,#和0),可以使用一个或者多个 |
数字 | 最小字段宽度 如果该字段不能容纳待打印的数字或字符串,系统会使用更宽的字段 如"%4d"
|
.数字 | 精度 对于%e,%E和%f,表示小数点右边数字的位数 对于%g和%G的转换,表示有效数字的最大位数 对于%s转换,表示待打印字符的最大位置 对于整型转换,表示待打印数字的最小位数 如果有必要使用前导0达到位数 只使用 . 时,表示后面紧跟一个0,即%.f和%.0f等价 |
h | 和整型转换说明一起使用,表示short int或unsigned short int类型的值 "%hu","%hx","%6.4hd" |
hh | 和整型类型一起使用,表示signed char或unsigned char "%hhu","%hhx","%6.4hhd" |
j | 和整型一起使用,表示intmax_t或uintmax_t类型的值(定义在stdint.h中) "%jd","%8jx" |
l | 和整型转换说明一起使用,表示long int或unsigned long int "%ld","%8lu" |
ll | 和整型一起使用,表示long long int或unsigned long long int 类型的值 "%lld","%8llu" |
L | 和浮点转换说明一起使用,表示long double "%Ld","%10.4Le" |
t | 和整型一起使用,表示ptrdiff_t类型的值,ptrdiff_t是两个指针变量的差值的类型 "%td","%12ti" |
z | 和整型转换说明一起使用。表示size_t类型的值。size_t是sizeof返回值的类型 "%zd","%12zd" |
(3)转换说明符修饰符中的标记
标记 | 含义 |
- | 待打印项左对齐,即从字段的的左侧开始打印该项 "%-20s" |
+ | 有符号值若为正,则在之前加上正号。若为负,加上减号 "%+6.2f" |
空格 | 有符号值为正,值前加上空格,为负加上减号 "% 6.2f" |
# | %o以0为开始显示,%x和%X以0x或0X为开头显示,%g和%G保证了后面的0不被删除 "%#o","%#8.0f","%+#10.3e" |
0 | 对于数值格式,使用前导0代替空格, |
(4)打印较长的字符串
允许一条语句分成多行。
printf("xxxxxxxxxxxxxxxxxx,%d",
name);//合法
printf("xxxxxxxxxxxxxxxx
xxxxx",name);//不合法
(5)printf的返回值
返回printf打印的字符数,如果出错,返回一个负值。
(6)符号*
使用*表示可变长度
double d = 1.234;
for (int i = 0; i < 4; i++)
{
printf("%.*lf\n",i,d);//使用i代替*
}
显示:
1
1.2
1.23
1.234
2.scanf
(1)转换说明
转换说明符号 | 输出 |
%c | 把输入解释为单个字符 |
%d | 把输入解释为有符号十进制整数 |
%e,%f,%g,%a | 把输入解释为浮点数 |
%E,%F,%G,%A | 把输入解释为浮点数 |
%i | 把输入解释为有符号十进制整数 |
%o | 把输入解释为无符号8进制数 |
%p | 把输入解释为指针(地址) |
%s | 把输入解释为字符串,从第一个非空白字符开始到下一个空白字符之前 |
%u | 把输入解释为无符号十进制整数 |
%x,%X | 把输入解释为无符号十六进制整数 |
(2)转换说明符修饰符
* | 抑制赋值 "%*d",对应的值不赋值 |
数字 | 最大字段宽度,输入达到最大字段宽度,会第一次遇到空白时停止 "%10s" |
hh | 把整数作为signed char或unsigned char 类型读取 "%hhd","%hhu" |
ll | 把整数作为long long或unsigned long long类型读取 "%lld","%llu" |
h,l或L | "%hd"和"%hi"表明对应的值存储为short int类型 "%ho","%hx"和"%hu"表明对应的值存储为unsigned short int类型 "ld%"和"%li"表明对应的值存储为long类型 "%lo","%lx"和"%lu",对应的值存储为unsigned long "%le","%lg"和"%lf"对应的值存储为double类型 在e,f,g前面使用L而不是l,表明对应的值存储为longdouble 如果没有修饰符,d,i,o和x表明对应的值存储为int类型,f和g表明对应的值存储为float类型 |
j | 在整型转换说明后面时,表明使用intmax_t或uintmax_t类型 |
z | 在整型转换说明后面时,转换为sizeof类型值 |
t | 在整型转换说明后面时,表明使用表示两个指针差值的类型 |
(3)scanf的返回值
返回成功读取到的项数
读到文件为返回EOF
读取错误返回0
3. printf和scanf不会进行自动数据类型转换
//实例
#include<stdio.h>
int main()
{
int i;
char c;
for(i=0;i<5;i++)
{
scanf("%d",&c);
printf("%d ",i);
}
return 0;
}
以上实例将char的c使用int输入,会存在一定的问题
scanf读入一个整数,后面应该是一个指向整型的地址,而是用一个指向字符的地址会导致不可预测的结果。
有种情况是i和c第地址连续,例如
c(8bit) | i(0--7bit) | i(7--15bit) | i(16--23bit) | i(24--31bit) |
如果输入1时,将1作为整型输入,因此
c(8bit)--0x01 | i(0--7bit)--0x00(原来的0x01被覆盖) | i(7--15bit)--0x00 | i(16--23bit)--0x00 | i(24--31bit)--0x00 |