1.4 标准输入/输出函数
输入是从输入设备(如键盘)向计算机输入数据的过程;输出是把程序的计算结果输出到输出设备(如显示器)的过程。C语言没有提供专门的输入/输出语句,是利用C标准函数库中提供的输入/输出函数实现的,C语言输入/输出函数库见附录D。
C标准函数库中专门的输入/输出函数很多,这些函数有格式输入/输出函数scanf()和printf(),字符输入/输出函数getchar()和putchar(),字符串输入/输出函数gets()和puts()等。这些函数的声明构成一个名为stdio.h的输入/输出函数库,用户程序要使用输入和输出函数时,要在程序文件的开始位置添加如下的宏定义,把stdio库包含到用户程序:
#include<stdio.h>
然后在用户程序中直接调用所需要的输入/输出函数即可。
1.4.1 格式化输出函数printf()
(1)printf函数的调用格式
stdio库提供的格式化输出函数printf()的主要功能是向显示器(标准输出设备)输出指定的若干个格式化的数据,适用于任意的数据类型。输出值正常,返回输出字节数;输出值出错,返回EOF(-1)。函数的一般调用格式为:
printf(格式控制字符串,输出列表);
例如:
说明:
①格式控制字符串是用双引号引起来的字符串,它包含如下三种信息:
·格式说明符:由“%”和格式字符组成,如%d、%f等。它总是由“%”开始,其作用是将输出的数据转换为指定的格式输出。
·普通字符:即要原样输出的字符,一般为提示信息。如“printf("a=%d,b=%f\n",a,b);”中的“a= ,b= ”即为提示信息,是为了便于用户更好地使用程序而加入的。
·转义字符:输出一些操作行为,如换行符等。
②“输出列表”是需要输出的一些数据项,可以是变量或表达式列表,其项数一般与控制参数中的格式转换控制符个数相同,格式如下:
如变量a的值为128,则上述语句的输出结果为:a=128。
(2)常用的格式控制字符
在printf()函数中常用的格式字符如表1-4所示。
表1-4 printf()函数中的格式字符
在printf()函数中除了这些常用的格式字符外,还可以在这些格式符前加以下几种特定的附加修饰符,用于修饰输出特定格式或数据类型,如表1-5所示。
表1-5 printf()函数中的附加格式修饰字符
(3)格式控制字符用法举例
下面我们来看它们的具体用法。
①d格式符:用来输出十进制带符号整数,有以下几种用法:
%d:按十进制整型数据的实际长度输出。
%md或%-md:m为指定的输出字段宽度为1个正整数。若实际数据的位数小于m,则左端补空格;若大于m,则按实际位数输出。当m前有“-”号时,表示按m指定宽度左对齐,右端补空格。
%ld:输出长整型数据,%mld输出指定宽度的长整型数据。
②c格式符:用于输出1个字符。
对于整数,只要它的值在0~255范围内,也可以用字符形式输出。
1个字符数据也可以转换成相应的整型数据(ASCII值)输出。
③s格式符:用于输出1个字符串。有以下几种用法:
%s:最常用格式,直接输出串的内容。
%ms或%-ms:输出的字符串占m列,如字符串本身长度大于m,则突破m的限制输出字符串的全部内容;若串长小于m,则输出的字符串左补空格。%-ms意义同上,但当串长小于m时,则输出的字符串右补空格。
%m.ns或%-m.ns:输出占m列,但只取串中左端的n个字符。这n个字符输出在m列的右侧,左补空格。%-m.ns中的m、n含义同上,但右补空格。而如果n>m时,m取n的值,即保证要求的n个字符输出。
【例1-7】读程序,理解printf函数指定格式输出的用法。
/ *源程序1-7.C* / #include <stdio.h> void main() { int i=100,j=1; / * 定义基本整型变量 * / long int a=123456; / * 定义长整型变量 * / float f1,f2; f1=(float)2738.54;f2=(float)-3.012; char cl='A',c2='a'; printf("%-12x\t%o\t%5d\n",i,i,j); printf("%+12.3f\t\t%-6.0f\n",f1,f2); printf("%3c\t%c\n",cl,c2); printf("c=%ld\tc=%12ld\n",a,a); / * 输出十进制长整数 * / printf("%3s,%7.3s,%.4s,%-5.2s\n","Super","Super","Super","Super"); }
本程序的运行结果为:
64 144 1 +2738.540 -3 Aa c=123456 c=123456 Super, Sup,Supe,Su
④o格式符:以八进制整数形式输出。
⑤x格式符:以十六进制整数形式输出。
⑥u格式符:用于输出unsigned(无符号)型数据,以十进制整数形式输出。
1.4.2 格式化输入函数scanf()
stdio库提供的scanf()函数可以用来从键盘(标准输入设备)输入任何类型的多个数据。输入正常,返回读取的代码值;输入出错,返回EOF(-1)。
(1)scanf函数的调用格式
scanf()函数的一般调用形式为:
scanf(格式控制字符串,地址列表);
“格式控制字符串”的含义同printf()函数。
“地址列表”是由若干个地址组成的列表,用于接收输入的数据。可以是变量的地址,或字符串的首地址等。
变量地址是由地址运算符“&”后接变量名组成的,例如,&a和&b分别表示了变量a和变量b的地址。&是一个取地址运算符,&a是一个表达式,其功能是求变量的地址。变量的地址是C编译系统分配的,用户不必关心具体的地址是多少。
(2)格式控制字符
scanf()函数与printf()函数中的格式字符基本相同,用法也基本相同,其差异见下面的说明。表1-6列出了scanf()函数中用到的格式字符,表1-7列出可以使用的附加修饰符。
表1-6 scanf()函数中的格式字符
表1-7 scanf()函数中的附加格式说明字符
对于unsigned类型的数据,在输入时既可以用%u,也可以用%d,甚至%x、%o均可。输入时可以指定数据所占的列数(域宽),系统将按它自动截取需要的数据。说明如下:
①scanf("a=%d b=%d ",&a1,&b1);
输入时的格式:a=10 b=20↙ / * 普通字符,要原样输入 * /
说明:系统取10给变量a,20给变量b。用"%d%d%d"格式输入时,不能用逗号(可用空格)作两个输入数据间的分隔符。
②scanf("%3d%2d",&a,&b);
输入:123456 ↙
输出:a=123,b=45
系统自动将123赋给a,45赋给b。也可用于字符型。
③scanf("%2d%*2d%d",&a,&b);
输入:123456↙
输出:a=12,b=56
说明:使用了“*”格式修饰符,则表示跳过它所指定的列数。则系统截取2位整数12赋给变量a,而跳过中间的两位34,取最后的两位56给变量b。
④输入数据时不能规定数据的精度,如以下的输入语句:
scanf("%7.2f",&a);
是不合法的。这样做变量a根本无法得到正确的输入。
1.4.3 字符输入输出函数
(1)字符输入函数getchar()
getchar()函数的功能是接收从终端(键盘或系统指定的输入设备)输入的1个字符,它没有参数,但从输入设备中接收的字符通过函数返回值的形式得到。其基本格式为:
ch=getchar();
其中ch为字符型的变量(或整型变量)。程序执行完此语句后,ch中即存入了用户从键盘上键入的字符。
(2)字符输出函数putchar()
putchar()函数的作用是向终端输出一个字符。其基本格式为:
putchar(c);
其用途是输出字符型参数c的值。参数c通常为字符型变量或字符常量,也可以是整型变量或整型常量(对大于255的整数,则只取低位字节中的数据)。
【例1-8】从键盘输入大写字母,用小写字母输出。
/ *源程序1-8.C* / #include <stdio.h> void main() { char c1,c2; c1=getchar(); / * 调用getchar()函数从键盘接收一个字符,并将之赋给变量c1* / printf("%c,%d\n",c1,c1); / * 调用printf()函数格式输出c1* / c2=c1+32; putchar(c2); / * 输出字符变量c2中的数据,即字符'a'* / printf("%d\n",c2); putchar('\n'); / * 输出换行符 * / }
程序的运行结果为:
输入:A ¿ 输出:A,65 a,97