2021-08-11

格式化输入 / 输出

在探索难以实现的问题时,问题本身的简单性只会是情况更糟。

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^(103次方)存入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函数来读取。

再见

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值