格式化输入 / 输出
目录
在探索难以实现的问题时,问题本身的简单性只会是情况更糟。
1. printf 函数
printf
函数被设计用来显示格式串的内容,并且在该串中的指定位置插入可能的值。
调用printf
函数时必须提供格式串,格式串后面的参数是需要在显示时插入到该串中的值:
printf("格式串",表达式1,表达式2……);
例如:
int i,j;
float x,y;
i=10;
j=20;
x=34.9998;
y=293.33;
printf("%d,%d,%f,%f\n",i,j,x,y);
其中的%d
和 %f
就是格式串。
如果把 int
型的数赋给 %f
或者把 float
型的数赋给 %d
会产生无意义的值。
比如printf("%d %d %f %f\n",x,y,i,j);
这样输出的x,y,i,j的值均是无意义的值。
1.1 转换说明
-
我们可以用
%m.pX
格式或者%-m.pX
的格式来显示小数点后带 p 个数字的 float 型值。其中m是最小字段宽度,m指定了要显示的最少字符数量。如果要显示的数值所需的字符少于m,那么值在字段内是右对齐的(即数值左边补空格)。如果要显示的值所需字符数多于m,那么字段宽度会自动拓展为所需的尺寸。在m前面放上一个负号会导致左对齐。(m是可以省略的)
-
%5d,%-5d,%05d,%.5d,%5.3d
%d:以十进制形式显示变量,且占用最少的空间。
%5d:至少占用5个字符,右对齐,不够补空格。
%-5d:至少占用5个字符,左对齐.
%05d:至少占用5个字符,右对齐,不够补0。
%.5d:至少占用5个字符,右对齐,不够补0。
%5.3d:至少占用5个字符的空间并且至少有3位数字,不够3个数字左边用0补上,不够5个字符的空间用空格补齐,右对齐。
1.2 转义序列
C语言转义序列
\a:警报(响铃)符。
\b:回退符。
\n:换行符。
\t:水平制表符。
\r:回车符。
回车符就是光标回到一旧行的开头;(即光标目前所在的行为旧行)
printf("世界第一上单\r我是");
输出结果:我是世界第一上单
\r回到这一行的开头"世界",然后输出后面的"我是"。
关于转义字符 \b(回退符)
在学习C语言的过程中,我发现转义字符\b的含义容易被误解为backspace,也就是键盘上的退格删除键。但事实并非如此。
先来看一段程序。
#include <stdio.h>
int main(void)
{
printf("123456789\b");
return 0;
}
这段程序编译运行的输出是:
123456789
可以看到末尾的字符9并没有被删除,这说明\b的行为与键盘上的backspace是不同的。
再来看一段程序。
#include <stdio.h>
int main(void)
{
printf("1234567\b\b\b\b89");
return 0;
}
编译运行这段程序,可以看到它的输出是:
1238967
可以看到,在输出1234567之后,因为紧接着要输出4个\b,这时程序把光标前(左)移了4个字符的位置,然后输出了89这两个字符,占用了45这两个字符的位置。但是因为67这两个字符已经输出,所以仍然显示在那里。
如果字符串是汉字会怎样呢?看下面的程序。
#include <stdio.h>
int main(void)
{
printf("我喜欢用C语言写\b\b\b程序");
return 0;
}
编译运行这段程序,可以看到它的输出是:
我喜欢用C程序写
可见,无论是汉字还是英文字母,\b的行为是一样的。
那么如果遇到换行符\n会怎样呢?再看一段程序。
#include <stdio.h>
int main(void)
{
printf("12345\n67\b\b\b\b89");
return 0;
}
这段程序在上面第一段程序的基础上,只是在字符6之前加上了换行符\n。其输出如下:
1. 12345
2. 89
可见,\b遇到换行符\n,光标就不会再向前(左)移动了。
总结:\b的含义是,将光标从当前位置向前(左)移动一个字符(遇到\n或\r则停止移动),并从此位置开始输出后面的字符(空字符\0和换行符\n除外)。
为了单独显示一个"
,要用到转义序列\"
。
为了单独显示一个\
,要用到转义序列\\
。
2. scanf 函数
scanf
函数根据特定的格式读取输入。像printf
函数的格式串一样,scanf
函数的格式串也可以包含普通字符和转换说明两部分。scanf
函数转换说明的用法与printf
函数的转换说明的用法本质上是一样的。scanf
函数在寻找起始数的位置时,会忽略空白字符。
当scanf函数遇到一个不可能属于当前项的字符时,它会把此字符放回原处,以便在扫描下一个输入项或者下一次调用scanf函数时再次读入。
比如下面4个数的排列:
1-20.3-4.0e3
我们使用与以前一样的scanf函数调用:
scanf("%d %d %f %f",&i,&j,&x,&y);
下面列出了scanf函数处理这组数的方法:
第一个%d: 把1存入i中,-放回原处。
第二个%d: 把-20存入j中,.放回原处。
第一个%f: 把0.3存入x中,-放回原处。
第二个%f: 把-4.0x10^3^(10的3次方)存入y中。
2.1 格式串中的普通字符
- 空白字符
当在格式串中遇到一个或多个连续的空白字符时,scanf函数从输入中重复的读空白字符直到遇到一个非空白字符为止。
这里用 · 代替空白字符
假如格式串为"%d/%d"
如果输入是 · 5 / · 96,那么第一个%d与5相匹配,第二个%d与96相匹配。
如果输入是 · 5 · / · 96,那么第一个%d与5相匹配,第二个%d与 · 相匹配(二者不匹配)。
- %i和%d都可以用于读写整数,在scanf函数中%d只能与十进制形式的整数相匹配,而%i可以与用八进制,十进制或者十六进制表示的数相匹配。
\t
使printf函数跳到下一个水平制表符处。scanf
函数将字符”放回原处“并在以后再次读取:我们知道,用户从键盘输入时,程序并没有读取输入,而是把用户的输入放在一个隐藏的缓冲区中,由scanf函数来读取。
再见
TOP | JUG | MID | ADC | SUP |
---|---|---|---|---|
Theshy | Ning | Rookie | Jackeylove | Baolan |