scanf和printf函数是系统的库函数,要使用它们需要需要包括一个<stdio.h>的头文件。
一、scanf函数。
scanf函数功能是按照指定的格式,从键盘输入若干数据给相应的变量。scanf("%d",&a);完全等同于fscanf(stdin,"%d",&a);(格式化读写函数,stdio表示从键盘输入,是默认的对应键盘的文件指针)。
语法:scanf(<格式控制字符串>,<变量地址列表>);
其中,格式控制字符包括格式转换说明符和输入分隔符。
(1)、格式转换说明符:
%d或%x | 输入十进制整数 |
%o | 输入八进制整数 |
%x | 输入十六进制整数 |
%c | 输入一个字符,空白字符(包括空格、回车、制表符)也作为有效字符输入 |
%s | 输入字符串,遇到第一个空白字符时结束 |
%f或%e | 输入一个float型的实数,以小数的形式或指数形式输入都可以 |
%lf | 输入一个double型的实数,以小数的形式或指数形式输入都可以 |
%% | 输入一个% |
(2)、输入分隔符:除了格式转换说明符以外的字符,输入时scanf将略去与输入分隔符相同的字符。格式控制字符串中没有显式地指定输入分隔符,则系统用默认的输入分隔符(空格、回车、制表符)来分割数据流。
总之,系统先按照输入分隔符将数据流分隔,再分别按照格式转化说明符进行数据转换,最后将转换后的数据送到变量地址列表所对应的变量中。
除此之外,“%”和格式字符之间还可以插入格式修饰符:
l | 加在格式符d,i,o,x,u之前用于输入long型数据 加在格式符f,e之前用于输入double型数据 |
L | 加在格式符f,e之前用于输入long double型数据 |
h | 加在格式符d,i,o,x,之前用于输入short型数据 |
域宽m | 指定输入数据的宽度(列数),系统自动按照此宽度截取输入数据 |
忽略输入* | 表示对应的输入项在读入后将不传送给相应的变量 |
注意事项:用scanf输入数据时,输入结束一定以回车符结束,格式控制字符穿最后切记用换行符‘\n’将会导致输入无法正常结束。
二、printf函数。
语法:printf(<格式控制字符串>,<输出参数表>);
其中,格式控制字符包括格式转换说明符和普通字符。
(1)、格式转换说明符:
%d或%i | 输出带符号的十进制整数,正数的符号省略。 |
%u | 以无符号的十进制整数形式输出。 |
%o | 以无符号的八进制整数形式输出,不输出前导符0。 |
%x | 以无符号的十六进制整数(小写)形式输出,不输出前导符0x。 |
%c | 输出一个字符。 |
%s | 输出字符串。 |
%f | 以十进制小数形式输出实数(包括单、双精度),隐含输出6位小数,输出的数字并非全都是有效数字,单精度实数的有效位数一般为7位(含小数点7位,小数点后默认最多6位,小于6位的话就用0来补),双精度实数的有效位数一般为16位。 |
%e(%E即大写E表示) | 以指数形式(小写e表示指数形式)输出实数,要求小数点前必须有且仅有1位非0数字。 |
%g | 自动选取f或e格式中输出宽度较小的一种使用,且不输出无意义的0。(只可以有6位数字) |
%% | 显示% |
例如:
输出语句 printf("%.10f, %.10f",3.141592653989793,.141592653s89793f ;的输出结果为:3.1415926536,3.1415927410。由于采用了显示精度格式修饰符“%10f,输出的两个圆周率数都显示到第10位小数。其中,第1个圆周率数 3.141592653589793为双精度实数 double 型常量,最大有效数字可达 16 位,能够满足显示精度格式的要求,因此,输出结果比较精确,且最后一位小数进行了四舍五人处理;而第2个圆周率数 3.141592653589793f为单精度实数 float 型常量,最大有效数字只有7位,达不到显示精度格式的要求,因此,输出结果在小数点后第 7位就出现了明显误差。
额外补充一点,在用 scanf函数输人实型数据时不能控制精度,否则将出错。
(2)、格式修饰符:
英文字母l | 修饰格式符 d、i、o、x、u 时,用于输出 long 型数据。 |
英文字母 L | 修饰格式符 f、e、g 时,用于输出 long double 型数据 。 |
最小域宽m(整数) | 指定输出项输出时所占的总列数。若m为正整数,当输出数据的实际宽度小干m时,在域内向右对齐,左边多余位补空格。当输出数据的实际宽度大于m时,按实际宽度全部输出;若m有前导符0,则多余位补0。若m为负整数,在域内向左靠齐,右边多余位补空格。 |
显示精度n(大于等于0的整数) | 精度修饰符位于最小域宽修饰符之后,由一个圆点及其后的整数构成。用于控制实型数的输出时,用于指定输出的实型数的小数位数(最后一位小数四舍五人);对于字符串,表示从字符串左侧开始截取的字串字符个数。 |
- | 有-表示左对齐输出,如省略表示右对齐输出。 |
注意:当显示精度截取字符串时,如:
char arr[]={"Ilovelearning."};
printf("%5.3s",arr);// Ilo
为什么会是这个结果呢?首先,‘5’表示它的域宽,得有5个字符,其次,‘3’是它的精度,表示从字符串左侧开始截取的字串字符个数为3个,因为不满5个字符,所以要在左侧补空格。