c语言之格式化输入输出

1. printf 函数

printf函数用来显示格式韦内容,迸且在该串中指定位置插入可能的值。(注:调用printf函数时必徒提供格式串,而其后参数需要在显示时插入到该串中的值

printf("格式串,表达式1,表达式2,表达式3");

1.1转换说明

转换说明( conversion specification),其中转换说明以字符%开头。转换说明是用来表示打印过程中待填充的值的占位符。跟随在字符%后边的信息指定了把数值从这内部形式(二进制)转换成打印形式(字符)的方法,这就是“转换说明”这一术语的由来。

具体来说,我们可以用%.1f来显示小数点后带位数字的float型值。更般地, 转换说明可以用%m .pX格式或%-m.pX格式,从这里的m和p都是整型常量,而X是字母。m和P都是可选的。如果省略p,m和p之间的小数点也要去掉。在转换说明%10.2f中, m是10, p是2,而X是f。在转换说明:10f中,m是10,p (连同小数点一起)省去了;而在转换说明%.2f中,p是2, m省去了

1.2最小栏宽

m指定了要显示的最少字符数量。如果要显示的数值所需的字符数少于m,那么值在字段内是右对齐的。(换句话说,在值前面放置额外的空格。)例如,转换说明%4d将以@123的形式显示数123 (用符号@表示空格字符)。如果要显示的值所需的字符数多于m,那么栏宽会自动扩展为所需的尺寸。因此,转换说明%4d将以12345的形式显示数12345,而不会丢失数字。在m前放上一个负号会导致左对齐;转换说明-4d将以123@的形式显示 123。

1.3精度

p的含义很难描述,因为它依赖于转换指定符X的选择。X表明在显示数值前需要对其进行哪种转换。对数值来说最常用的转换指定符有以下几个:

d-- 表示十进制(基数为10)形式的整数。p指明了待显示数字的最少个数(必要时在数前加 上额外的零);如果省略p,则默认它的值为1

e--表示指数 (科学记数法)形式的浮点数。p指明了小数点后应该出现的数字个数(默认值为6)。如果p为0,则不显示小数点。

f--表示 “定点十进剧”形式的浮点数,没有指数。p的含义与说明符e中的一样

g--指数形式或者定点十进制形式的浮点数,形式的选择根据数的大小来决定,意味着可以显示的有效数字(不是小数点后的数字)的最大数量。与转换指定符f不同,g的转换将不显示尾随的零,并且如果要显示的楼值没有小数点后的数孛,g不会显示小数点

printf函数格式化数字

#include <stdio.h>

int main()
{
    int i;
    float x;

    i = 40;
    x = 839.21f;

    printf("|%d|%5d|%-5d|%5.3d|%-5.3d\n", i, i, i, i, i);
    printf(" %10.3f | % 10.3e | % -10g |\n", x, x, x);
   
    return 0;
    }

   
   

在显示时,printf函数格式串中的字符1只是用来帮助显示每个数所占用的空格数量。
同于或\,字符1对printf函数而言没有任何特殊意义。此程序的输出如下:

|40|   40|40   |  040|040
    839.210 |  8.392e+02 |  839.21    |


%d以十进制形式显示变量i,且占用最少的空间。


%5d 以十进制形式显示变量i,且至少占用5个字符的空间。因为变量i只占2个 字符,所以添加了3个空格。

%-5d一以十进制形式显示变量上, 且至少占用5个字符的空间。因为表示变量主的值不需要用满5  个字符,所以在后续位置上添加空格(更确切地说,变量i在长度为了的字段内是左对齐的)。

%5.3以十进制形式显示变量i,至少占用5个字符的空间, 并至少有3位数字。因为变量i只有2个字符长度,所以要添加一个额外的一个零来保证有3位数字。现在只有3个字符长度,为了保证占有5个字符,还要添加2个空格(变量i是右对齐的)。


%-5.3以十进制形式显示变量i,至少占用5个字符的空间, 并至少有3位数字。因为变量i只有2个字符长度,所以要添加一个额外的一个零来保证有3位数字。现在只有3个字符长度,为了保证占有5个字符,还要添加2个空格(变量i是左对齐的)。但因为有换行符所以不显示
 

%10.3f以定点十进制形式显示变量x, 且总共用10个字符,其中小数点后保留了3位数字。因为变量x只需要7个字符(即小数点前3位,小数点后3位,再加上小数点本身1位)所以在变量x前面有3个空格。

%10.3e 以指数形式显示变量x,且总共用10个字符,其中小数点后保留3位数字。因为变量x总共需要9个字符(包括指数),所以在变量x前面有1个空格。


%-10g既可以以定 点十进制形式显示变量 x,也可以以指数形式显示变量x, 且总共用10个字符。在这种情况下,printf 函数选择用定点十进制形式显示变量x。负号会进行强制左对齐,因此有4个空格跟在变量x后面。

1.4转义序列

格式串中常用的代码\n被称为转义序列( escape sequence )。转义序列(>7.3节)使字符串
句含一些特殊字符而不会使编译器引发问题,这些字符包括非打印的(控制)字符和对编译器
有特殊含义的字符(如" )。后面会提供完整的转义序列表,现在先看一组示例:
警报(响铃)符: \a
回退符: \b
换行符: \n
水平制表符: \t

当这些转义序列出现在printf函数的格式串中时,它们表示在显示中执行的操作。在大多数机器上,输出\a会产生一-声鸣响,输出\b会使光标从当前位置回退一个位置, 输出n会使光标跳到下一行的起始位置,输出\t会把光标移动到下一个制表符的位置。

2.scanf函数

就如同printf函数用特定的格式显示输出一样,scanf函数也根据特定的格式读取输入。像printf函数的格式串一样,:scanf函数的格式串也可以包含普通字符和转换说明两部分。scanf函数转换说明的用法和pr intf函数转换说明的用法本质上是一一样的。

像printf函数-样, scanf函数是由格式串控制的。调用时,scanf 函数从左边开始处理字符串中的信息。对于格式串中的每一一个转换说明,scanf 函数从输人的数据中定位适当类型的项,并在必时跳过空格。然后,scanf函数读人数据项,并且在遇到不可能属于此项的字符时停止。如果读人数据项成功,那么scanf丽数会继续处理格式串的剩余部分;如果某一项不能成功读人,那么scnf函数将不再查看格式审的剩余部分(或者余下的输人数据),并立即返回。

当scanf函数遇到一个不可能属于当前项的字符,它会把此字符放回原处,便于在扫描下一个输入项或者下一次调用scanf函数时再次读入
 

1-20.3-4.0e3\n


我们使用与以前一样的scanf函数调用:

scanf("%d%d%f%f", &i,&j,&x,&y);


下面列出了scanf函数处理这组新输人的方法。
1.转换说明%d。第一个非空的输人字符是1;因为整数可以以1开始,所以scanf 函数接着读取下一个字符,即-。scanf函数识别出字符-不能出现在整数内,因此把1存人变量i中,而把字符放回原处。
2.转换说明%d。随后,scanf函数读取字符-、2、0和. (句点)。 因为整数不能包含小数点,所以scanf函数把- 20存人变量j中,而把字符.放回原处。
3.转换说明%f。接下来scanf函数读取字符.、3和-。因为浮点数不能在数字后边有负号,所以scanf函数把0.3存人变量x中,而把字符-放回原处。
4.转换说明%f。最后,scanf函数读取字符-、4、、0、e、3和\n(换行符)。因为浮点数不能包含换行符,所以scanf丽数把4.0x10的三次方存入变量y中,而把换行符放回原处。

5.在这个例子中,scanf函数能够把格式串中的每个转换说明与个输人项进行匹配。 因为换行符没有读取,所以它将留给下一次scanf函数调用。

2.1格式串中的普通字符
 

通过编写含有普通字符和转换说明的格式串能进一步地理解模式匹配的概念,scan函数采取的动作依赖于这个字符是否为空白字符。
空白字符  :当在格式申中遇到一个或多个连续的空白字符时,scanf 函数从输人中重复读空白字符,直到遇到一个非空白字符(把该字符“放回原处”)为止。格式串中空白字符的数量无关紧要,格式串中的一一个空白字符可以与输人中任意数量的空白字符相匹配。(附带提-下,在格式串中包含空白字符并不意味着输人中必须包含空白字符。格式串中的一一个空白字符可以与输人中任意数量的空白字符相匹配,包括零个。)
其他字符 当在格式串中遇到非空白字符时,scanf函数将把它与下一个输入字符进行比较。如果两个字符相匹配,那么scanf函数会放弃输入字符,并继续处理格式串。如果两个字符不匹配,那么scanf函数会把不匹配的字符放回输人中,然后异常退出,而不进一步处理格式串或者从输人中读取字符。

2.2


虽然scanf函数调用和print函数调用看起来很相似,但其实特别容易混淆
1.一个常见的错误是执行 print函数调用时在变量前面放置&。

printf("%d%d",&a,&s);

幸运的是,这种错误是很容易发现的: printf函数将显示一对奇怪的数字,而不是变量a和s的值。


在寻找数据项时,scanf 函数通常会跳过空白字符。因此除了转换说明,格式串通常不会要包含字符。

2.另一个常见错误是假定scanf格式串应该类似于printf格式串,这种不正确假定可能引发scanf函数行为异常。我们来看一下执行下面这个scanf函数调用时,到底发处
了什么:

scanf("%d,%d",&a,&s)

scanf函数首先寻找输人中的整数,把这个整数存人变量a中;然后scanf 函数将试图把逗号与下一个输入字符相匹配。如果下一个输人的字符是空格而不是逗号,那么scanf函数将终止操作,而不再读取变量j的值
 


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值