.n
对实数,指定小数点后位数(四舍五入)
对字符串,按指定实际输出位数
-
输出数据在域左对齐(缺省右对齐)
+
指定在有符号数的正数前显示正号(+)
0
输出数值时指定左面不使用的空位置自动填0
#
在八进制和十六进制数前显示前导0、0x和0X
l
在d、o、x、X、u前,指定输出精度为long型
在e、f、g前,指定输出精度为double型
(1)格式输出函数的一般形式
函数原型:
intprintf(char*format[,argument,…]);
函数功能:
按规定格式向输出设备(一般为显示器)输出数据,并返回实际输出的字符数,假设出错,如此返回负数。
A、它使用的一般形式为:
printf("格式控制字符串",输出项列表);
B、语句中"输出项列表"列出要输出的表达式(如常量、变量、运算符表达式、函数返回值等),它可以是0个、一个或多个,每个输出项之间用逗号(,)分隔;输出的数据可以是整数、实数、字符和字符串。
C、"格式控制字符串"必须用英文的双引号括起来,它的作用是控制输出项的格式和输出一些提示信息,例如:
inti=97;printf("i=%d,%c\n",i,i);输出结果为:
i=97,a
语句printf("i=%d,%c\n",i,i);中的两个输出项都是变量i,但却以不同的格式输出,一个输出整型数97,另一个输出的却是字符a,其格式分别由"%d"与"%c"来控制。
语句printf("i=%d,%c\n",i,i);的格式控制字符串中"i="是普通字符,他将照原样输出;"%d"与"%c"是格式控制符;"\n"是转义字符,它的作用是换行。
(2)格式控制
格式控制由格式控制字符串实现,格式控制字符串由3局部组成:
普通字符、转义字符、输出项格式说明。
A、普通字符。
普通字符在输出时,按原样输出,主要用于输出提示信息。
(空格属于普通字符)
B、转义字符。
转义字符指明特定的操作,如"\n"表示换行,"\t"表示水平制表等。
\n换行
\f清屏并换页
\r回车
\tTab符
\xhh表示一个ASCII码用16进表示,其中hh是1到2个16进制数
C、格式说明局部由"%"和"格式字符串"组成,他表示按规定的格式输出数据。
格式说明的形式为:
%[flags][width][.prec][F|N|h|l]type||%[标志][输出最少宽度][.精度][长度]类型
各局部说明如下:
a、[]表示该项为可选项,即可有可无,如printf("%d",100);
b、%:
表示格式说明的起始符号,不可缺少。
c、flags为可选择的标志字符,常用的标志字符有:
-——左对齐输出,默认为右对齐输出
+——正数输出加号(+),负数输出减号(-),如省略正数的+默认不显示
0——输出数值时指定左面不使用的空位置自动填0,如省略表示指定空位不填
#——对c、s、d、u类无影响;对o类,在输出时加前缀0(数字0,八进制表示符);对x类,在输出时加前缀0x(字母为小写);对X类,在输出时加前缀0X(字母为大写);对e,g,f类当结果有小数时才给出小数点。
d、width为可选择的宽度指示符。
用十进制正整数表示设置输出值得最少字符个数。
不足如此补空格,多出如此按实际输出,默认按实际输出,例如:
printf("%8d\n",100);(前面空五格)100
printf("%08d\n",100);(前面5个0)100
printf("%6d\n",100);(前面空三格)100
printf("%-8d\n",100);100(后面空五格)
printf("%+8\n",100);(前面空四格)+100
e、[.prec]为可选的精度指示符
用“小数点〞加“十进制正整数〞表示,对“整数〞、“实数〞和“字符串〞的输出有如下功能:
对整数:
表示至少要输出的数字个数,不足在整数之前补0,多如此原样输出;
对实数:
表示小数点后至多输出的数字个数,不足在实数之后如此补数字0,多如此做舍入处理;
对字符串:
表示最多输出的字符个数,不足补空格,多如此丢弃。
由上图可以看出,对于字符串而言,其实直接使用精度指示符是没有意义的,详细解释见(3)F
f、[F|N|h|l]为可选的输出长度修饰符,其功能如下:
F——输出远指针存放的地址;
N——输出近指针存放的地址;
h——输出短整型数据的值;
l——输出长整型或双精度型数据的值。
g、type指定输出的数据类型
(3)输出数据类型说明
格式字符用以指定输出项的数据类型和输出格式。
A、d格式:
用来输出十进制整数。
有以下几种用法:
%d:
按整型数据的实际长度输出。
%md:
m为指定的输出字段的宽度。
如果数据的位数小于m,如此左端补以空格,假设大于m,如此按实际位数输出。
%ld:
输出长整型数据。
B、o格式:
以无符号八进制形式输出整数。
对长整型可以用"%lo"格式输出。
同样也可以指定字段宽度用"%mo"格式输出。
例:
intmain()
{
inta=-1;
printf("%d,%o",a,a);
}
运行结果:
-1,177777
C、x格式:
以无符号十六进制形式输出整数。
对长整型可以用"%lx"格式输出。
同样也可以指定字段宽度用"%mx"格式输出。
D、u格式:
以无符号十进制形式输出整数。
对长整型可以用"%lu"格式输出。
同样也可以指定字段宽度用"%mu"格式输出。
E、c格式:
输出一个字符。
F、s格式:
用来输出一个串,有几中用法
%s:
例如:
printf("%s","CHINA")输出CHINA字符串。
%ms:
输出的字符串占m列,如字符串本身长度大于m,如此突破获m的限制,将字符串全部输出。
假设串长小于m,如此左补空格。
%-ms:
如果串长小于m,如此在m列围,字符串向左靠,右补空格。
%m.ns:
输出占m列,但只取字符串中左端n个字符。
这n个字符输出在m列的右侧,左补空格。
%-m.ns:
其中m、n含义同上,n个字符输出在m列围的左侧,右补空格。
如果n>m,如此自动取n值,即保证n个字符正常输出。
G、f格式:
用来输出实数(包括单、双精度),以小数形式输出。
有以下几种用法:
%f:
不指定宽度,整数局部全部输出并输出6位小数。
%m.nf:
输出共占m列,其中有n位小数,如数值宽度小于m左端补空格。
%-m.nf:
输出共占n列,其中有n位小数,如数值宽度小于m右端补空格。
对于单精度数,使用%f格式符输出时,仅前7位是有效数字,小数6位
对于双精度数,使用%lf格式符输出时,前16位是有效数字,小数6位
H、e格式:
以指数形式输出实数。
可用以下形式:
%e:
数字局部(又称尾数)输出6位小数,指数局部占5位或4位。
%m.ne和%-m.ne:
m、n和"-"字符含义与前一样。
此处n指数据的数字局部的小数位数,m表示整个输出数据所占的宽度。
I、g格式:
自动选f格式或e格式中较短的一种输出,且不输出无意义的零。
(4)h和l前缀与u
%hd--shortint
%ld--longint
%lld--longlongint
%lu--unsignedlong
%llu--unsignedlonglong
%ho--八进制显示short整数
%lx--十六进制显示long整数
%le-以科学计数法表示longdouble
(5)特殊说明
A、需要打印%时,必须之前还要加上一个%
printf("%f%%",1.0/3);输出0.333333%
B、*的用法
a、printf("%*d\n",8,100);结果:
(前面空五格)100
b、intm=8;printf("%*d\n",m,100);结果:
(前面空五格)100
c、charch[20];printf("%*.*s\n",m,n,ch);说明:
前边的*定义的是总的宽度,后边的定义的是输出的个数。
分别对应外面的参数m和n。
我想这种方法的好处是可以在语句之外对参数m和n赋值,从而控制输出格式。
C、%n的用法:
可以将所输出字符串的长度值赋给一个变量
intslen;printf("helloworld%n",&slen);执行后变量slen被赋值为11
3、scanf函数(主要缺陷就是在缓冲区制造垃圾字符,不建议太过复杂的用法)
(1)完毕条件
A、空格、TAB或回车
B、宽度完毕
C、非法输入(比如程序里scanf中是%d的形式,结果输入的时候输入一个浮点类型的数)
(2)格式说明符
(3)scanf函数返回正确读取的元素的个数
inta,b,c;
scanf("%d%d%d",&a,&b,&c);//不能忘了写取地址符
正确输入时其返回值为3
(4)输入的格式要与程序里的格式保持一致
inta,b,c;
scanf("%d,%d,%d",&a,&b,&c);
输入的时候要输入2,3,4才是正确的
(5)抑制符*
这里跟printf中不同,他表示指定输入项读入后不赋给变量
inta,b;
scanf("%3d%*4d%f",&a,&b);
printf("a=%d,b=%f\n",a,b);
(6)垃圾字符(详见4getchar中的解释)
4、字符输入输出getchar和putchar
(1)putchar
A、在理解getchar()之前,首先搞清楚一个概念:
当从键盘上输入字符(数字、字符、符号)时,系统是默认先把输入的容先存放在缓存空间上,当按下回车(Enter)键后getchar(),才开始从缓存空间逐一开始读取数据,注意getchar(),读取数据是逐一、单个读取的,也就是一次只读取一个字符的值,返回对应字符的ASCII码值。
B、理解上面容,那么:
a、如果想要检测输入的字符是哪一个,可以用getchar()和对应字符的ASCII值进展比拟,注意比拟的形式必须是:
例如:
if(getchar()!
='a'||getchar()!
='\n')的这种形式,即检测从键盘上输入的是不是a或者回车。
b、getchar()从缓存里面读取数据,直到它读取到回车键时才完毕
c、如果从键盘上输入一连串的字符
例如:
输入adndjdjejd3458jjjfkal按下回车键(他也会被getchar读取),缓存区中容为adndjdjejd3458jjjfkal\n
d、scanf()函数从缓存区读取数据的时候,不读取回车键,不返回回车键的值;getchar()函数从缓存区读取数据的时候,读取回车键,而且会将回车键的值进展返回,同时读取回车后完毕本次读入
那么,在使用完scanf或者getchar之后如果还有输入函数,甚至scanf遇到非法输入完毕,下一个函数必然会读取他们在缓冲区遗留的垃圾,这就是其缺陷所在。
(2)putchar不带自动换行
举例:
1、/*输入ab时取到的ch2是空格(输入时产生的)*/
#include
intmain(intargc,constchar*argv[])
{
charch1;
charch2;
charch3;
ch1=getchar();
ch2=getchar();
ch3=getchar();
printf("mun=%d\n",ch2);
putchar('\n');
printf("ch1=%c,ch2=%c\n",ch1,ch2);
return0;
}
5、字符串输入输出gets和puts
(1)gets函数不以空格作为字符串输入完毕的标志,而以回车作为完毕标志。
缺陷:
由于c语言中数组的长度必须事先给定,所以输入很容易超出这个长度,数组越界(这是很严重的问题)
(2)puts函数在输出字符串时,会自动追加'\n'。
使用时,注意字符数组必须以'\0'完毕。