C语言提供的格式化输入输出函数的原型在头文件stdio.h
中声明,在使用时应在程序头部包含该文件:
#include <stdio.h>
或
#include "stdio.h"
1. 格式化输出函数printf
-
功能:
-将数据按指定的格式输出到标准输出流中(如屏幕)。
-
语法格式:
-printf(格式控制字符串,输出列表);
-格式控制字符串:使用" "括起来的用于表示输出格式的字符串 (字符串中可以包含任何字符,如空格、转义字符,甚至汉字)。格式控制字符串在输出时遵循两种规则:
(1)普通字符在输出时,按原样输出。转义字符则输出它所代表的字符(一般是控制字符)。
(2)格式字符串:
一般形式:%[标志] [输出最小宽度] [.精度] [长度] 类型
方括号[删除线格式 ]中的项表示可省略项。
方括号中各项的意义如下:
1、类型
表示输出数据的类型,其格式符和意义如下表所示:
2、标志
标志字符为-、+、#、空格四种,其意义下表所示:
-:结果左对齐,右边填空格。
+:输出符号(正号或负号)。
空格:输出值为正时冠以空格,为负号时冠以符号。
#:对c、s、d、u类无影响,在输出时加前缀0;对x(X)类,在输出时加前缀0x(0X);对e、g、f类当结果有小数时才给出小数点。
3、输出最小宽度
用十进制整数来表示输出的最少位数。若实际位数多于定义的宽度,则按实际位数输出,若实际位数少于定义的宽度则左补空格(数据右对齐)。
4、精度
精度以“.”开头,后面跟十进制整数。如果输出数字,则该十进制数表示小数的位数;如果输出的是字符,则表示输出字符的个数。(实际位数大于所定义的精度数时,省略超出的部分。)
5、长度
长度格式符有h、l两种,h表示按短整型输出,l表示按长整型输出。
-输出列表:
若干要输出的数据项,可以是常量、变量或表达式,各项用逗号“,"隔开(输出项的类型应该与格式控制符一一对应)。
常用示例:
#include <stdio.h>
int main()
{
int i = 6;
int j = 100;
double d = 8.8888888; //数据宽度为9列,小数部分占7列
char ch = 'A'; //定义字符常量ch
//等号、汉字原样输出;换行符控制换行,不显示;格式控制符控制格式
printf("整数i=%d\ni+1=%3d\n",i,i+1); //输出项分别为整型变量、表达式(数组宽度不足3,则左补0)
printf("小数d=%8.5f\n",d); //双精度浮点型变量(数据总共9列宽,小数部分占5列)
printf("单个字符输出:%c\n字符串输出:%s\n",ch,"nb666"); //输出项分别为字符变量、字符串常量
printf("十进制数j转十六进制输出:j=0x%x\n",j); //以十六进制输出无符号整数(不带前缀0x或0X)
printf("程序结束!"); //原样输出
return 0;
}
程序运行结果为:
注意:区别字符常量和字符串常量。如:"a"是字符串常量,'a’是字符常量。引号不属于字符串,而是起到界定作用。
2. 格式化输入函数scanf
-
功能:
-从标准输入流中(如键盘)按指定格式接收输入的数据。
-
语法格式:
-scanf(格式控制字符串,地址列表);
-格式控制字符串:用于指定输入的格式。由格式控制符和普通字符构成。
(1)普通字符:在输入数据时,按原样输入。
(2)格式字符串:
一般形式:% [*] [输入数据宽度] [长度] 类型
方括号[删除线格式 ] 中的项表示可省略项。
方括号中各项的意义如下:
1、类型
表示输入数据的类型,其格式符和意义如下表所示:
2、“*” 符
跳过该输入值,不赋予相应的变量。
例如:
scanf("%d*d%d",&a,&b);
当输入为:1 2 3时,把1赋予a,2被跳过,3赋予b。
3、宽度
用十进制整数来指定输入的宽度(即字符数)。
例如:
scanf("%5d",&a);
输入:123456
结果:只把12345(前5位)赋予变量,其余部分被截去。
又如:
scanf("%4d%4d",&a,&b);
输入:12345678
结果:将1234赋予a,5678赋予b。
4、长度
长度格式符有h、l两种,h表示输入短整型数据,l表示输入长整型数据(如%ld)或双精度浮点数(如%lf)。
-地址列表:
若干输入数据项的内存地址(通常是变量的地址),各地址间用逗号“,"隔开(输入数据项的数量、类型必须与格式控制符从左到右一一对应)。
常用示例:
/*语法格式区别*/
//printf(格式控制字符串,输出列表);
//scanf(格式控制字符串,地址列表);
//注意:在输入数据时要求原样输入!!!
#include <stdio.h>
int main()
{
int data1,data2,data5;
int z,i,j;
float x,y,data7;
char data3,data4,data6;
//整数输入
printf("请输入两个整数\n");
scanf("%d%d",&data1,&data2); //地址列表应是变量的地址
printf("输入完毕\n");
printf("输入的数据为: %d %d\n",data1,data2); //输出列表应是变量名
fflush(stdin); //清除输入缓冲区的内容
//字符输入
printf("\n请输入两个字符\n");
scanf("%c",&data3);
scanf("%c",&data4); //输入时不要使用空格、回车等转义字符
printf("输入完毕\n");
printf("输入的字符为: %c %c\n",data3,data4);
//混合输入
printf("\n请分别输入整数、字符、小数\n");
scanf("%d%c%f",&data5,&data6,&data7); //输入时不要使用空格、回车等转义字符(转义字符不会显示在屏幕上)
printf("输入完毕\n");
printf("输入的小数为: %d %c %f\n",data5,data6,data7);
//小数输入:当输入为:0.1 0.2 0.3时,把0.1赋予x,0.2被跳过,0.3赋予y
printf("\n请输入三个小数\n");
scanf("%f%*f%f",&x,&y); //%*f表示:该输入项,读入后不赋予相应的变量,即跳过该输入值
printf("输入完毕\n");
printf("输入的小数为: %f %f\n",x,y);
printf("\n请输入两个个八位数\n");
scanf("%5d",&z); //输入为:12345678时,只把12345赋予变量z,其余部分被截去
fflush(stdin); //清除输入缓冲区的内容
scanf("%4d%4d",&i,&j); //输入为:12345678时,将1234赋予i,而5678赋予j
printf("输入完毕\n");
printf("输入的小数为: %d %d %d",z,i,j);
return 0;
}
程序运行结果为:
注意:使用scanf函数时,取地址符号“&”不要漏了,输入数据时一定要原样输入(尤其字符输入时,慎用回车换行)!!!