【C语⾔】⼀⽂全了解常⽤格式化函数
格式化输⼊与输出
本⽂通过函数原型–参数–返回值–实例的顺序⼀⼀解析C语⾔中常⽤输⼊输出函数。⾸先对在格式化输⼊输出中经常出现的控制格式以表格形式列出。
格式控制字符
以printf为例: printf(“%[falgs][width][.prec ][hIL]type”)
flags
falgs说明
-左对齐
+在前⾯放+或者-
00填充
width或.prec
width或.prec说明
number最⼩字符数
*下⼀个参数是字符数
.number⼩数点后的位数
.*下⼀个参数是⼩数点后的位数
hIL
hIL说明
hh单个字节
h short
I long
II long long
L long double
type
type说明
%d, %i以⼗进制输出⼀个整数
%o, %O分别⽤⼤⼩写以⼋进制输出⼀个整数
%x, %X分别⽤⼤⼩写以⼗六进制输出⼀个整数
%f输出⼀个浮点数(单精度)
%c输出⼀个字符
%s输出⼀个字符串
%e以科学计数法输出⼀个浮点数(双精度)
%g⾃动选择合适的表⽰法输出(会⾃动去掉多余的零)
type说明
%u输出⼀个⽆符号整数
%p打印地址
%%, %”打印百分号或引号
转义字符
转义字符说明
\n换⾏
\t制表符(Tab)
\r回车
格式化输出
1.printf()函数
函数原型:
int printf(const char*format,...);
函数说明:
printf函数的调⽤格式为:printf("<;格式化字符串>", <;参量表>);
格式化字符串(format)中包含两部分:⼀是正常字符,按照原样输出;⼆是以%开始的可控字符,由参量表中的内容决定。参量表就是⼀系列需要输出的参数,可以有多个参数,各个参数之间⽤","分开,并且与格式化字符串中的可控字符的个数⼀⼀对应。
返回值:对于绝⼤部分初学者来说⼏乎没⼈去关⼼printf的返回值,甚⾄说有⼀部分⼈可能都不知道它有返回值,但是从函数原型中我们可以看到它确实是有的,printf函数的返回值就是输出的字符数量,该数量包括数字,字母,标点符号,空格和换⾏等。
下⾯通过⼀个例⼦来说明,想必对printf函数就会很清楚了,同时也会对同时也会对上⾯的控制字符有清晰地认识。
#include<stdio.h>
int main(void)
{
printf("%3d\n",12345);
printf("%9d\n",123);
printf("%09d\n",123);
printf("%-9d\n",123);
printf("%+9d\n",123);
printf("%-+9d\n",123);
printf("%+-9d\n",123);
printf("%9.2f\n",123.0);
printf("%*d\n",6,123);
/
/测试printf的返回值
int num =12345;
int i1 =printf("%d\n", num);
int i2 =printf("%d", num);
printf("\ni1 = %d\ti2 = %d\n", i1, i2);
return0;
}
运⾏结果:
结果分析:
通过前⾯的表可以知道,width中的number是最⼩的字符数,它的意思是:如果实际输出的位数不够,则会补齐位数,如果实际输出位数⽐它⼤,则原样输出,如运⾏结果中的第⼀⼆⾏。其它的⼤家应该都能看懂,我来解释⼀下printf("%*d\n", 6, 123);* 表⽰下⼀个参数是字符数,于是这个语句其实等价于printf("%6d\n", 123);通过运⾏结果我们也可以看出来,最后确实是输出了6个字符。那么这样做有什么好处呢?这样做的话,我们就可以通过使这个参数为变量,从⽽让整个程序更为灵活,⽽且这个变量也可以让⽤户⾃⼰输⼊。即代码变
成printf("%*d\n", number, 123);。最后我们来看printf的返回值,我们知道printf返回的是输出的字符个数,i1=6,i2=5,是因为i1多打印了⼀个换⾏符,所以如果你想使⽤printf的返回值必须对换⾏符制表符加以注意,因为那也是⼀个字符。
2.sprintf函数
函数原型:
int sprintf(char*str,const char*format,...);
函数说明:
sprintf函数的主要功能是把格式化的数据(format)写⼊某个字符串中,即发送格式化输出到string所指向的字符串。
函数调⽤形式:sprintf(str, “<;格式字符串>”, <;参量表>);
从函数原型中可以看出sprintf和printf⼗分相似,对于相同的部分,在此不再赘述。不同之处在于多了⼀个指向char类型的指针str,通常情况下我们会定义⼀个字符数组,它的作⽤是存储字符串。
返回值:函数调⽤成功则返回字符串长度(这个长度并不包括字符串末尾的空字符),如果失败则返回⼀个负数。注意:使⽤该函数要避免堆栈溢出,或选择使⽤更为安全的snprintf函数。
下⾯进⾏代码分析:
#include<stdio.h>
int main(void)
{
int x =123;
int i =0;
char str[10]={0};
i =sprintf(str,"%d",123);
printf("str = %s\ti = %d\n", str, i);
return0;
}
//运⾏结果:
str =123 i =3
结果分析:
运⾏的结果如我们所设想的那样,123被存放到str的数组中,并且函数的返回值也正是字符个数。对于不同的打印格式这⾥就不再演⽰,可以参照printf函数部分的代码。
注意,请读者试着编译运⾏下⽅代码,观察运⾏结果是否如你所想
sprintf(str,"%.2f",123);
printf("str = %s", str);
3.fprintf函数
函数原型:
int fprintf(FILE *stream,const*format,...);
函数说明:
fprintf函数主要作⽤是格式化输出到⼀个流⽂件中,即将指定格式(format),输⼊到stream中去。
函数调⽤形式:sprintf(str, “<;格式字符串>”, <;参量表>);
通过函数原型我们可以知道fprintf函数与sprintf函数很相似,区别就是sprintf是向字符数组写⼊数据,fprintf则是向⽂件写⼊数据,具体的实现⽅法,则是通过向指向FILE的指针,写⼊数据。
返回值:成功返回输出的字节数,失败返回EOF(end of file)。
下⾯进⾏代码分析:
#include<stdio.h>
int main(void)
{
int i;
FILE *stream =fopen("","w");
i =fprintf(stream,"%d",123456);
printf("i = %d\n", i);
return0;
}
//运⾏结果
i =6
运⾏结果:
结果分析:
123456被成功的输⼊到⽂件中了, 函数的返回值i=6。对于fopen函数可能有些⼈不是很了解,由于本⽂主要说的是格式化输⼊输出函数,所以不会在此展开,后⾯会专门写⼀篇关于⽂件操作的函数。
格式化输⼊函数
1.scanf函数
函数原型:
int scanf(const char*format,...);
函数说明:
scanf函数是从标准输⼊流中读取内容,并将其保存在对应的地址中。
函数调⽤形式:scanf("<;格式化字符串>",<;地址表>);
scanf函数和printf函数是很相似的,对于初学者来说,它们也是使⽤率极⾼的两个函数,所以他们的使⽤⽅法都⼤致相同,在此提⼀下,在写地址标的变量时,⼀定不要忘记取址符&,同时它还有⼀个⽐较特殊但是很有⽤的格式控制字符[],它的作⽤是扫描字符集合,具体后⾯会上代码进⾏解释。
返回值: 返回成功读⼊的数据个数,如在读⼊数据时遇到“⽂件束”则返回EOF。
其实关于scanf函数可以说的有很多,但是由于篇幅原因,本⽂会选择经常容易出现的错误来举例,不会说得⼗分详细,有兴趣的⼩伙伴可以⾃⾏查阅资料,或者在下⽅进⾏评论。
下⾯进⾏代码分析_1:
#include<stdio.h>
int main(void)
{
int x, y, z;
scanf("%d%d%d",&x,&y,&z);
printf("x = %d\ty = %d\tz = %d\n", x, y, z);
return0;
}
结果分析:
//⼀下输⼊⽅式都合法,分别输⼊2/3/4代表x/y/z
234
234
2
3
4
//输出结果都为:
x =2  y =4  z =6
//原因分析
scanf函数会在操作中略去⼀个或多个空⽩符,直⾄出现第⼀个⾮空⽩符为⽌,所以以上输⼊⽅式都是可以的
字符串比较函数实现下⾯进⾏代码分析_2:
//只附上关键部分代码
scanf("%d,%d,%d",&x,&y,&z);
scanf("x=%d,y=%d,z=%d",&x,&y,&z);
结果分析:
//scanf的格式控制字符串可以有其它⾮空⽩符,但是在输⼊时必要将这些字符按照相同的⼀并输出
//下列输⼊是合法的
//对于第⼀句scanf
3,4,5/3,4,5/
3,
4,5/
//对于第⼆句scanf
x=3,y=4,z=5/x=3,        y=4,z=5/
//下列语句是不合法的
3,4,5
x =3, y=4, z=5
此外你可能会有所疑问,如果我想输⼊⼀段英⽂⽂字,那么它是如何判定我这个是⼀句话还是⼀段话
呢?答案是⽆法判定,scanf函数会⾃动略去空⽩符,所以它就只能读取你的第⼀个单词,那么这样⼀来我们是不是就⽆法输⼊⼀段⽂字呢?答案当然是可以输⼊的,这是就需要⽤到前⾯说的⼀种控制字符[],具体的效果及使⽤⽅法看代码。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。