格式化输入输出

常量的表示

整型

下面是一个整型常量,该常量用十六进制表示为 64 64 64,为unsigned long long类型。

0x64ULL

一般地,一个整型常量可以分为四个部分:

[进制][数字][长度][类型]

程序代码中的数字若不加前缀,默认为十进制。常用的进制还有八进制或十六进制。数字前添加前缀0表示八进制数,数字前添加前缀0x0X表示十六进制数。数字的表示必须符合前缀规定的进制。

下面是一些不同进制的整数的例子:

123456
0264370
0x7f938e

数字若不加后缀,默认为int类型。若超过了int能表示的范围,则为long类型。若超过了long能表示的范围,则为unsigned long类型。若仍然不能表示该数,则为long longunsigned long long类型。

若要用长度较长的数据类型储存较小的数字,可以添加后缀。后缀lL表示用long类型存储,后缀llLL表示用long long类型存储,可以形象地理解成一个lL表示一个long(但lLLl没有意义)。

若要强调无符号类型,可以添加后缀uU,该后缀可以形象地理解成unsigned。无符号类型后缀与长度后缀的先后顺序不作要求,大小写也可以不统一。例如下面是有意义的后缀:ul uLL lU LLu。下面是没有意义的后缀:uLl lLU lul LuL

有符号类型的正数,其正号可以省略。

下面是一些不同类型的整数的例子:

0ll
-69028
12345678987654321ULL

字符

打印字符可以表示为添加单引号的字符。如字符A

'A'

非打印字符可以通过转义序列赋值,同样需要添加单引号。如换行符:

'\n'

下表是部分字符对应的转义序列:

转义序列含义
\a警报:发出蜂鸣,但不移动屏幕光标
\b退格:把活跃位置左移。通常不会擦除经过的字符
\f换页:把活跃位置移至下一页的开始处(只有在输出到打印机上时才有效)
\n换行:把活跃位置移至下一行的开始处
\r回车:把活跃位置移至当前行的开始处
\t水平制表符:把活跃位置移至下一个水平制表点
\v垂直制表符:把活跃位置移至下一个垂直制表点(只有在输出到打印机上时才有效)
\\反斜杠
\'单引号
\"双引号
\?问号

除上表外,还有一种转义序列,通过字符的ASCII码表示该字符。使用转义序列时,ASCII码只能使用八进制或十六进制。在\后直接添加ASCII码,或在ASCII码前添加前缀0,均表示八进制;在ASCII码前添加前缀xX表示十六进制。例如下面都是字符A的转义序列(字符A的ASCII码的八进制表示为 101 101 101,十六进制表示为 41 41 41)。

'\101'
'\x41'

浮点型

下面是一个用e计数法表示的浮点型常量,该常量等于 2.87 × 1 0 − 3 = 0.00287 2.87\times 10^{-3}=0.00287 2.87×103=0.00287,为float类型。

2.87E-3F

下面是一个用p计数法(C99)表示的浮点型常量,该常量等于 ( 10 + 1 16 + 15 256 ) × 2 10 = 10364.0 \left(10+\dfrac 1{16}+\dfrac{15}{256}\right)\times 2^{10}=10364.0 (10+161+25615)×210=10364.0,为double类型。

0xa.1fp10

一般地,一个浮点型常量可以分为五个部分:

[整数部分].[小数部分][指数部分][类型]

e计数法表示的浮点数aebaEb可以理解成 a × 1 0 b a\times 10^b a×10b,但是不必满足科学记数法的形式,其中a为有符号十进制小数,b为有符号十进制整数,正号可以省略。若 a a a的整数部分为 0 0 0,整数部分可以省略(但若小数部分也为 0 0 0则不能省略);若 a a a的小数部分为 0 0 0,小数部分可以省略;若 b = 0 b=0 b=0,则ebEb可以省略(但若小数部分已省略则不能省略)。

下面是一些用e计数法表示的浮点数的例子:

-32.576
.618
28.E-6
2.95e-8
6e3

p计数法表示的浮点数apbaPb可以理解成 a × 2 b a\times 2^b a×2b,其中a为有符号十六进制小数(需要添加前缀0x0X),b为有符号十进制整数,正号可以省略。

浮点数默认为double类型,可以通过添加后缀来改变数据类型。后缀fF表示用float类型存储,后缀lL表示用long double类型存储。

printf()输出

输出格式控制符的基本格式如下:

%[标记][最小字段宽度].[指定精度][长度][类型]

标记、宽度、精度

标记分为五种,可以同时使用多种,也可以都不使用。这里先介绍四种:

  • -表示左对齐;
  • +表示显示数字的符号;
  • 空格表示显示前导空格;
  • 0表示显示前导零。

下面是+标记的例子:

printf("%+d\n",215);
printf("%+d\n",-215);

其输出的结果为

+215
-215

-、空格、0通常和最小字段宽度搭配使用。最小字段宽度通常用十进制整数表示;也可使用字符*,此时最小字段宽度为printf()的下一个参数。若该字段不能容纳待打印的内容,系统会使用更宽的字段。

示例一:

printf("[%3d]\n",7939);
printf("[%6d]\n",7939);
printf("[%-6d]\n",7939);
printf("[% 6d]\n",7939);
printf("[%06d]\n",7939);
[7939]
[  7939]
[7939  ]
[  7939]
[007939]

示例二:

int width=6;
printf("[%*d]\n",width,7939);
[  7939]

最小字段宽度后紧跟的是指定精度。与最小字段宽度类似,指定精度用十进制整数或字符*表示;但数字(或字符*)前面必须有一个.。若既没有.也没有数字(或字符*),则不指定精度;若只有.而没有数字(或字符*),相当于.后面有一个数字0。指定精度的含义稍后说明。

长度与类型

输出格式控制符中的长度如下:

修饰符类型含义
h整型short
hh整型char类型
j整型intmax_t类型(无符号为uintmax_t类型)1
l整型long
ll整型long long(C99)
L浮点型long double类型
t整型ptrdiff_t类型(C99)2
z整型size_t类型(C99)3

类型如下:

类型含义
aA浮点数,p计数法(C99)
c字符
di有符号十进制整数
eE浮点数,e计数法
f浮点数
gG浮点数,指数小于 − 4 -4 4或大于等于精度时选择%e%E,否则选择%f
o无符号八进制整数
p指针
s字符串
u无符号十进制整数
xX无符号十六进制整数
%百分号

长度和类型可以搭配使用,例如%d表示以int类型输出,%hd表示以short类型输出,%Lf表示以long double类型输出。特别地,%%输出百分号,不过在不与格式控制符混淆的情况下也可直接用%输出百分号。

示例一:

printf("%d\n",12345678987654321);
printf("%lld\n",12345678987654321);
printf("%hd\n",12345);
printf("%hhd\n",12345);
1653732529
12345678987654321
12345
57

示例二:

printf("%f\n",28.5970);
printf("%e\n",28.5970);
printf("%a\n",28.5970);
printf("%g\n",28.5970);
28.597000
2.859700e+01
0x1.c98d4fdf3b646p+4
28.597

示例三:

printf("%d\n",7939);
printf("%o\n",7939);
printf("%x\n",7939);
7939
17403
1f03

补充

下面介绍不同类型下的指定精度和第五种标记#的含义。

  • 对于一般的浮点型eEf,指定精度表示小数点右边数字的位数;
  • 对于浮点型gG,指定精度表示有效数字最大位数;
  • 对于字符串类型s,指定精度表示待打印字符的最大数量;
  • 对于整型,指定精度表示待打印数字的最小位数,必要时使用前导零。

示例:

printf("%.2f\n",352.4678);
printf("%.2f\n",352.4);
printf("%.4g\n",13.6666);
printf("%.4g\n",13.6);
printf("%.8s\n","periodic table");
printf("%.18s\n","periodic table");
printf("%.4d\n",2643779);
printf("%.10d\n",2643779);
352.47
352.40
13.67
13.6
periodic
periodic table
2643779
0002643779
  • 对于一般的浮点型,#表示保留小数点;
  • 对于浮点型gG#表示保留末尾的0
  • 对于八进制整型o、十六进制整型xX#表示显示相应进制的数字前缀,八进制前缀为0,十六进制前缀为0x0X

示例:

printf("%.0f\n",352.47);
printf("%#.0f\n",352.47);
printf("%.5g\n",13.600);
printf("%#.5g\n",13.600);
printf("%x\n",7939);
printf("%#x\n",7939);
352
352.
13.6
13.600
1f03
0x1f03

scanf()输入

输入格式控制符的基本格式如下:

%[抑制赋值][最大字段宽度][长度][类型]

宽度、长度与类型

最大字段宽度用十进制整数表示;与printf()输出不同,不能使用字符*和函数参数。输入达到最大字段宽度处,或第一次遇到空白字符时停止。

示例:

int x;
scanf("%d",&x);     printf("%d\n",x);
scanf("%4d",&x);    printf("%d\n",x);
scanf("%4d",&x);    printf("%d\n",x);

若输入

2643779 2643779

则输出为

2643779
2643
779

输入格式控制符中的长度如下:

修饰符类型含义
整型int类型
浮点型float类型
hh整型char类型
ll整型long long(C99)
h整型short
l整型long
l浮点型double类型
L浮点型long double类型
j整型intmax_tuintmax_t类型
t整型ptrdiff_t类型(C99)
z整型size_t类型(C99)

类型如下:

类型含义
c字符
di有符号十进制整数
eEfFgGaA浮点数(C99新增aA
o有符号八进制整数
p指针(地址)
s字符串(从第一个非空白字符开始,到下一个空白字符之前的所有字符)
u无符号十进制整数
xX有符号十六进制整数
[ ]结果字符集(从第一个非空白字符开始,到第一个不在字符集内的字符之前的所有字符)
[^ ]定界字符集(从当前字符开始,到第一个在字符集内的字符之前的所有字符。若当前字符在字符集内,则输入为空)

示例一:

int x;
scanf("%d",&x);     printf("%d\n",x);
scanf("%o",&x);     printf("%d\n",x);
scanf("%x",&x);     printf("%d\n",x);

若输入

7939 17403 1f03

或者

7939 017403 0x1f03

输出的结果都是7939

示例二:

double x;
scanf("%le",&x);     printf("%f\n",x);
scanf("%lf",&x);     printf("%f\n",x);
scanf("%lg",&x);     printf("%f\n",x);
scanf("%la",&x);     printf("%f\n",x);

若输入

28.597 0.28597e2 0x1.c98d4fdf3b646p4 28.597000

输出的结果都是28.597000

事实上,在用scanf()输入时,eEfFgGaA没有区别。

示例三:

char s[10];
scanf("%[ab]",s);      printf("%s\n",s);
scanf("%[^ab]",s);     printf("%s\n",s);
scanf("%[a-d]",s);     printf("%s\n",s);

若输入

abcd cabcdabef

则输出为

ab
cd c
abcdab

抑制赋值

正常情况下scanf()会将读取到的内容赋值给参数位置的变量。使用抑制赋值符*后,scanf()会照常读取内容,但读取相应的格式控制符的内容后不进行赋值。

示例:

int x;
scanf("%d",&x);        printf("%d\n",x);
scanf("%*d%d",&x);     printf("%d\n",x);

若输入

15 26 37

则输出为

15
37

  1. 这些类型定义在stdint.h中。 ↩︎

  2. ptrdiff_t是两个指针差值的类型。 ↩︎

  3. size_tsizeof的返回类型。 ↩︎

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值