1 printf()
参考C printf() 详解之终极无惑
printf(“格式化字符串”, 输出表列)
字符串常量原样输出,在示中起提示作用。输出表列
中给出了各个输出项,要求格式控制字符串
和各输出项在数量和类型上应该一一对应。其中格式控制字符串
是以 % 开头的字符串,在 % 后面跟有各种格式控制符
,以说明输出数据的类型、宽度、精度等。
- 格式控制字符串
- %[flags][width][.prec][length]type
- %[标志][最小宽度][.精度][类型长度]类型。
- 主要介绍类型,类型是必不可少的
1.1 整型
#include <stdio.h>
int main()
{
int a = 34, b = -123;
printf("%d\n%d\n",a,b); //不指定域宽输出整型变量
printf("%5d\n%5d\n",a,b); //指定域宽输出整型变量
printf("%5d\n%5d\n",34,-123); //指定域宽输出整型常量
return 0;
}
34
-123
34
-123
34
-123
- o格式符:以
无符号八进制整数
形式输出(不输出前导符号0)
- e.g. int a=-1;
printf(“%d,%o”,a,a);
输出为: -1,37777777777
- e.g. printf(“%13o”,a);
输出为: (空两格)37777777777
- x\X格式符:以
无符号十六进制
数形式输出整数,x对应的是abcdef,X对应的是ABCDEF
(不输出前导符号0x)
- e.g.int a=-1;
printf(“%x,%o,%d”,a,a,a);
输出结果为: ffffffff,37777777777,-1
- e.g.printf(“0x%x 0x%X”,123,123);输出0x7b 0x7B
- u格式符:用来输出
无符号十进制整型
数据。
1.2 字符型
- c格式字符:用于输出一个字符。输出时,也可指定域宽
- 可以把输入的数字按照ASCII码相应转换为对应的字符
- printf(“%c\n”,64)输出A
- s格式字符: 用于输出一个字符串
1.3 浮点型
-
f格式字符
- %f
不指定数据宽度和精度
,整数部分全部输出,小数部分保留6位。(包括float型和double型)
- 单精度浮点数用f,双精度浮点数用lf(printf可混用,但scanf不能混用)
e.g. 用%f格式输出浮点数。
printf(“ %f\n”, 1.0/3);
【运行结果】
0.333333
- %m.nf
整体(不是整数)
输出m位,其中小数部分输出n位。
- m指定最小宽度,n为精度
e.g.
printf(“ %20.15f\n”, 2.0/3);
【运行结果】(空三格)0.666666666666667
e.g. 负号为左对齐
printf(“ %-20.15f\n”, 2.0/3);
【运行结果】
0.666666666666667(空三格)
- float型数据只能保证6位有效数字
- double型数据能保证15位有效数字
- 计算机输出的数字不都是绝对精确有效的
-
e\E格式字符:以指数型式输出浮点数
- 科学计数法,使用指数(Exponent)表示浮点数,
此处"e"的大小写代表在输出时“e”的大小写
#include <stdio.h>
int main(void)
{
double d = 256.789;
printf("%e\n", d); //不指定数据宽度和精度输出,默认六位小数
printf("%15.3e\n",d); //指定数据宽度和精度输出,宽度15,三位小数
return 0;
}
2.567890e+02
2.568e+02 前面六个空格
- g\G格式字符:用来输出实数。
-
根据数值的长度,自动选f格式或e格式(选择输出时占宽度较小的一种)
,且不输出无意义的零。
- printf(“%g %g”,0.000000123,0.123);输出1.23E-07 0.123
- G:指数用E表示,如输出2.345E+15
1.4 其他
1.4.1 标志
- ‘-’(减号):结果左对齐,右边填空格。默认是右对齐,左边填空格。
1.4.2 输出最小宽度
1.4.3 精度
1.4.4 类型长度
- 类型长度指明待输出数据的长度。因为相同类型可以有不同的长度,比如整型有
char(8bits)、short int(16bits),int(32bits)和 long int(64bits)
,浮点型有 32bits 的单精度 float
和 64bits 的双精度 double
。
- l:用于长整型整数如ld,lo,lx,lu
1.5 转义字符
2 scanf()
scanf()函数是格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。
其调用格式为:scanf(“<格式化字符串>”,<地址表>);
2.1scanf( )函数的一般形式
- scanf(格式控制字符串,地址列表)
- 格式控制字符串含义与printf函数类似
- 地址列表:可以是变量的地址,或字符串的首地址
void main( )
{ int a,b,c;
scanf(“%d %d %d”,&a,&b,&c);
printf(“%d,%d,%d\n”,a,b,c);
}
- “&”为地址运算符,不得漏写。
- 用“%d%d%d”输入数据时,数据项之间不能用逗号而只能用空格、回车或Tab键作分隔符。
2.2 基本规则和注意事项
- 最小宽度可指定输入数据所占列数,系统自动截取所需数据。
如:scanf(“%3d%3d”,&a,&b);
输入123456时,则a的值为123,b的值为456 。
-
可在%后附加“ *”跳过相应的数据
。如:
scanf(“%d%*c%d”,&a,&b);
跳过一个字符,实现以任意字符作为分隔符
scanf(“%2d %*3d %2d”,&a,&b);
输入12 345 67时,a的值为12,b的值为67。
-
输入数据时不能规定精度
。
-
注意问题:
-
“格式控制”后面应当是变量地址
,而不应是变量名。
- “格式控制”字符串除格式说明以外的其它字符,输入数据时应输入与这些字符相同的字符
表 |
scanf() |
正确输入 |
1 |
scanf(“%d%d”,&a,&b); |
1 2 |
2 |
scanf(“%d %d”,&a,&b); |
1 2或1 2(多几个空格) |
3 |
scanf(“%d,%d\n”,&a,&b); |
1, 2 |
4 |
scanf(“%d:%d:%d”,&m,&n,&p); |
1:2:3 |
5 |
scanf(“a=%d,b=%d,c=%d”,&a,&b,&c); |
a=1,b=2,c=3 |
- 在用“%c”格式输入字符时, 空格和“转义字符”都为有效字符。(没有回车)
如:scanf(“%c%c%c”,&c1,&c2,&c3);
若输入a b c时,则c1的值为‘a’,c2的值为空格,c3的值为‘b’。
- 输入数值数据时,输入非数值字符,认为该数据结束
- 幻影换行:在用“%c”格式输入字符时,若前面已输入数据并回车(有时必须回车),则scanf会“吃掉”回车。 文末附了详细文章解释 。
- 总结:
- scanf会以
空格、制表符、换行符
作为结束符,且不读走
,会将其留在键盘缓冲区中
,给下一次输入留下隐患。
- %d会跳过空格、制表符、换行符(读走,不保存)
直到输入变量达到指定个数
。但%c什么都读,包括空格、制表符、换行符
。比如:第一次scanf输入回车结束后,scanf不读走换行符,而是留了一个‘\n’在缓冲区。则下一次再用scanf(‘%c’)就会将读入一个转义字符’\n’。一般用一个gerchar()解决。
- 用scanf读入字符串(%s)存在隐患,因为中间遇到空格会结束。一般用字符串函数,另一篇笔记中有详细介绍C语言 第九章 字符串
scanf(“%d%d”, &x, &ch);
等价于
scanf(“%d %d”, &x, &ch);
输入两个整型,中间空格大于等于1个(包括回车)都行。
比如12 5 或12(空三格)5
因为%d会跳过空格、制表符、换行符(读走,不保存)直到输入变量达到指定个数
3 字符数据的输入输出
存储在<stdio.h>中
3.1 字符输出函数putchar( )
向显示器输出单个字符
常量或字符变量的值,一般形式为:putchar(字符常量) 或putchar(字符变量)
3.2 字符输入函数getchar( )
从计算机终端(一般为键盘)输入一个字符。一般形式为: getchar( )
假设程序要求用getchar()处理字符输入,用scanf()处理数值输入,这两个函数都能很好的完成任务,但是不能混合使用。 因为getchar()读取每个字符,包括空格、制表符和换行符;而scanf()在读取数字时则会跳过空格、制表符和换行符。
这章其实很多细节要想明白还是很难的
推荐博客。
、
【C语言】scanf语句吃掉回车或者空格问题详解
C语言 getchar()原理及易错点解析