首页 理论教育C语言程序数据输入输出

C语言程序数据输入输出

【摘要】:C语言中没有输入输出语句,C程序中的输入和输出主要是通过C编译系统提供的输入输出函数来实现。程序中使用最多的是格式输出函数printf、格式化输入函数scanf、字符输入函数getchar以及字符输出函数putchar,它们是I/O类标准库函数。在C程序中输出数据时,必须按照被输出数据项的数据类型来控制格式的选择。例如,%6.2f说明输出域宽为6位,整数部分占3位,小数部分占2位。格式控制字符串用于规定为程序提供数据的样式。

C语言中没有输入输出语句,C程序中的输入和输出主要是通过C编译系统提供的输入输出函数来实现。程序中使用最多的是格式输出函数printf、格式化输入函数scanf、字符输入函数getchar以及字符输出函数putchar,它们是I/O类标准库函数。使用输入/输出类标准库函数需要在源程序的开始位置加上文件包含编译预处理命令:

#include<stdio.h>或者#include"stdio.h"

1.格式化输出函数printf

printf函数功能是按指定的格式输出数据,是获得程序运行结果的主要途径。printf使用的常见格式有两种:

·printf("字符序列");

·printf("格式控制字符串",输出项列表,);

第一种格式的作用是将"字符序列"表示的内容输出到控制台(通常指的是显示器)上。例如,语句printf("This is a string.\n")的作用是在显示器上输出字符串“This is a string.”,然后换行。

第二种格式的功能是将一个或多个数据按照控制字符串规定的格式输出到标准输出设备(显示器)。

printf函数的使用主要涉及两个方面,输出数据项和格式控制字符串。

输出项也称为输出表列,是需要输出的数据,它可以是常量、变量和表达式,当有多个输出项时,相互之间用逗号分隔。例如,printf("%d",a);表示按整数形式输出变量a的值,printf("%f,%f",x,y);表示按小数形式输出变量x和y的值。

格式控制字符串用于规定输出数据的样式,格式控制字符串包含两种字符:格式说明符和普通字符。格式控制字符串中的普通字符按原样输出,即在对应的位置上输出串中对应字符。格式控制字符串中的格式说明项由“%”和格式字符组成,其作用是指定输出参数的格式,格式控制项应与输出表列中的输出表项一一对应,指定输出表项的输出格式。表2.4给出了格式说明符的功能。

表2.4 printf函数的格式说明符

【例2.7】 输出数据时格式控制字符选择示例。

在C程序中输出数据时,必须按照被输出数据项的数据类型来控制格式的选择。例如,程序中变量x是整型变量,需要使用%d控制输出;变量a是实型变量,需要使用%f控制输出,实数默认输出6位小数,不足6位的末尾用0填充。程序执行结果如下:

在printf函数的格式控制字符串中,“%”和格式字符之间可以插入一些附加符号(即修饰符),对输出形式进一步进行限制。一个完整的控制项格式为:

%-*m.n l/h<格式控制字符>

控制项中各可选项的意义为:

(1)长度修正可选项l/h

长度修正项用于指定对应位置输出数据是按“长类型数据”输出还是按“短类型数据”输出,具体选择原则如下:

①使用ld格式控制输出带符号长整数数据;使用lo、lx、lu格式控制输出无符号长整型数据;使用lf、le、lg格式控制输出双精度实型数据。

②使用hd格式控制输出带符号短整数数据;使用ho、hx、hu格式控制输出无符号短整型数据。

特别提示:在一些C系统中,只使用对应格式控制字符就可以正确地输出长整型数据、短整型数据以及双精度实型数据。但在某些系统中则必须使用带l或者带h的格式控制输出。

(2)域宽可选项m.n

域宽可选项用于指定对应输出项所占的输出宽度,即指定用多少个字符位置来显示对应输出数据,具体选择原则如下:

①整型数据没有小数显示的问题,取单一整数来指定输出数据的宽度。例如,%8d说明输出域宽为8,即用8个字符所占的位置来展示对应的整型数据项。

②实型数据可以选取m.n格式,指定输出总宽度为m位,其中小数点占一位,小数部分为n位。例如,%6.2f说明输出域宽为6位,整数部分占3位,小数部分占2位。输出实型数据时,如果没有指定小数位数,则C系统默认输出6位小数。

③字符串数据也可以选用m.n格式,其中m仍然表示字符串数据输出使用的宽度,n指定的是仅输出字符串数据的前n个字符。例如,printf("%6.3s\n","123abc");只输出字符串中的前3个字符123。

特别提示:如指定的域宽不足以显示数据(即输出数据需要的位数超过指定的域宽),输出数据按自己需要的实际位数输出。如指定的域宽多于数据要求的宽度,则默认在左边留出空格。

(3)“*”可选项

含有“*”可选项的格式控制项对应输出表列中连续两个数据项,其意义是用前一个数据项(只能是整型数据)的值作为后一个数据项输出的指定域宽。

【例2.8】 输出格式控制项中的“*”可选项使用示例。

上面程序的格式控制项中有“*”可选项,对应输出表列中的连续两项a和x(数据项也可以使用常数表示),使用前项a的值作为后项x的输出宽度指定。程序执行结果如下:

x=1      23.46

(4)减号可选项

减号可选项用于指定对应输出数据的对齐方向。当选用减号时,输出数据左对齐(即如有空格则留在输出数据的后面);当不用减号时,输出数据右对齐。

2.格式化输入函数scanf

格式化输入函数scanf用来按指定格式从键盘输入数据到指定的变量,是为程序运行提供原始数据的主要途径。格式化输入函数使用的一般格式为:

scanf("格式控制字符串",地址表列);

函数中的地址表列中的每一项为一个地址量,其形式是在一般变量之前加地址运算符&,例如,有变量x,则&x表示变量x的地址。多个地址项之间用逗号分隔。

格式控制字符串用于规定为程序提供数据的样式。格式控制字符串中的普通字符必须照原样输入,除了使用普通字符在输入函数的格式控制字符串中指定输入数据的分隔形式外,在格式控制字符串中普通字符的其他用法都是不可取的。特别需要指出的是,不要在输入函数的格式控制字符串中插入换行符“\n”,否则程序有可能陷入死循环。如果在两个格式控制项之间没有任何的普通字符分隔,则C系统默认的输入数据分隔符是空白符,即“空格键”“Tab键(即转义字符'\t')”或者“回车键(即转义字符'\n')”。

控制字符串中的格式控制项指定数据的输入格式,与地址列表中的地址表项一一对应。在为每一个地址表项指定输入控制符时,必须根据对应变量的数据类型在表2.5中进行选择。

表2.5 scanf函数的格式说明符

续表

在scanf函数的格式控制字符串中,“%”和格式字符之间也可以插入一些附加符号,一个完整的控制项格式为:

%*m l/h<格式控制字符>

控制项中各可选项的意义为:

(1)长度修正可选项l/h

长度修正项用于指定对应输入数据是按“长类型数据”输入还是按“短类型数据”输入,具体选择原则如下:

①使用ld格式控制输入带符号的长整数数据;使用lo、lx、lu格式控制输入无符号的长整型数据;使用lf、le格式控制输入双精度实型数据。(www.chuimin.cn)

②使用hd格式控制输入带符号的短整数数据;使用ho、hx、hu格式控制输入无符号的短整型数据。

特别提示:在一些C系统中,使用对应的格式控制字符d、o、x、u就可以正确地输入长整型数据或短整型数据,但对于双精度实型数据,必须使用lf、le格式控制。

(2)域宽可选项m

域宽可选项用于指定输入数据时在输入流上最多截取的字符个数,即当输入流上的字符个数足够多时,依次截取指定个数的字符;如果输入流上的字符个数不足时,则取完为止。

(3)“*”号可选项

“*”的作用是表示“虚读”,即从键盘上按指定格式输入一个数据,但并不赋给任何变量。例如,函数调用语句:scanf("%3d%*2d%f",&a,&b);执行时,若输入数据为12345678.9,则a=123,b=678.9,其中对应控制格式%*2d的输入字符流45被从输入流中截取出来并被系统忽略抛弃。

由于格式化输入函数中不能显示提示信息,所以常常用格式化输出函数配合以实现带有输入提示信息的代码段。例如,下面程序段演示了这种组合形式:

【例2.9】 输入数据时的格式控制字符选择示例。

/*Name:e0209.c*/

在上面程序中的数据输入函数调用中,参照欲输入的数据类型选择相应的输入格式控制字符。程序一次执行的过程和执行结果是:

3.字符数据的输入输出

在C程序中,字符数据的输入输出除可以使用scanf函数和printf函数实现外,还可以使用专门的字符数据输入输出函数。

(1)字符数据输出函数

putchar和putch都是用于单个字符输出的函数,函数原型为:

int putchar(char ch);

int putch(char ch);

函数的功能是把字符ch输出到标准输出设备(显示器)上,正常输出时返回值为显示字符的ASCII码值;输出出错时则返回EOF(-1)。

putchar在头文件stdio.h中声明,putch在头文件conio.h中声明,使用时必须在程序中使用预处理命令包含对应的头文件。

【例2.10】 字符输出函数putchar和putch使用示例。

(2)字符数据输入函数

C语言的字符输入函数包括getchar、getche、getch,它们的原型如下:

int getchar();

int getche();

int getch();

常用的使用形式为:

char ch;

ch=getchar();

ch=getche();

ch=getch();

其中,getchar函数在头文件stdio.h中声明,输入字符数据时可以键入一个或一串字符,按回车键结束输入。输入的字符数据会显示在屏幕上(回显),但只有第一个字符被接收到指定变量。

getche函数在头文件conio.h中声明,输入字符数据时只能键入一个字符,不需要按回车键结束输入。输入字符会显示在屏幕上,同时字符被接收到指定变量。

getch函数在头文件conio.h中声明,输入字符数据时只能键入一个字符,不需要按回车键结束输入。输入字符不会在屏幕上显示,字符被接收到指定变量。

【例2.11】 字符输入函数getchar、getche和getch使用示例。

上面程序执行的过程和结果是:

请连续输入ABC3个字符:BC

ABC

从显示信息可以看到,由于为变量c1输入字符值时使用的是getch函数,输入时对应字符并没有回显到屏幕上。