3.2 数据的输入与输出 在程序的运行过程中,往往需要由用户输入一些数据,而程序运算所得到的计算结果等又需要输出给用户,由此实现人与计算机之间的交互,所以在程序设计中,输入输出语句是一类必不可少的重要语句,在C语言中,没有专门的输入输出语句,所有的输入输出操作都是通过对标准I / O库函数的调用实现。最常用的输入输出函数有scanf( )、pri ntf( )、getchar( )和putchar( ),以下分别介绍。
3.2.1 scanf()函数 格式化输入函数scanf( )的功能是从键盘上输入数据,该输入数据按指定的输入格式被赋给相应的输入项。函数一般格式为: scanf( "控制字符串",输入项列表); 其中控制字符串规定数据的输入格式,必须用双引号括起,其内容是由格式说明和普通字符两部分组成。输入项列表则由一个或多个变量地址组成,当变量地址有多个时,各变量地址之间用逗号“,”分隔。 scanf( )中各变量要加地址操作符,就是变量名前加“ &”,这是初学者容易忽略的一个问题。应注意输入类型与变量类型一致。 下面探讨控制字符串的两个组成部分:格式说明和普通字符。 1. 格式说明 格式说明规定了输入项中的变量以何种类型的数据格式被输入,形式是: % [ <修饰符> ] <格式字> 各个格式字符及其意义见表3 - 1。 表3-1 输入格式字符 格式字符 意义 d 输入一个十进制整数 o 输入一个八进制整数 x 输入一个十六进制整数 f 输入一个小数形式的浮点数 e 输入一个指数形式的浮点数 c 输入一个字符 s 输入一个字符串
各修饰符是可选的,可以没有,这些修饰符是: ⑴ 字段宽度 例如:scanf("%3d",&a) 按宽度3输入一个整数赋给变量a。 ⑵ l和h 可以和d、o、x一起使用,加l表示输入数据为长整数,加h表示输入数据为短整数,例如: scanf("%10ld % hd" , &x , &i) 则x按宽度为1 0的长整型读入,而i按短整数读入。 ⑶ 字符* *表示按规定格式输入但不赋予相应变量,作用是跳过相应的数据。 例如: scanf("%4d % *d % 4d" , &x , &y , &z) 执行该语句,若输入为“1 2 3” 结果为x = 1,z = 3,y未赋值,2被跳过。
2. 普通字符 普通字符包括空格、转义字符和可打印字符。 (1) 空格 在有多个输入项时,一般用空格或回车作为分隔符,若以空格作分隔符,则当输入项中包含字符类型时,可能产生非预期的结果,例如: scanf("%d %c" , &a , &ch) 输入32q 期望a = 32,ch = q,但实际上,分隔符空格被读入并赋给ch。 为避免这种情况,可使用如下语句: scanf("%d %c" , &a , &ch) 此处% d后的空格,就可跳过字符“ q”前的所有空格,保证非空格数据的正确录入。 (2) 转义字符: \n、\t 先看下面的例子: scanf("%d %d" , &a , &b); scanf("%d %d %d" , &x , &y , &z); 输入为1 2 3 4 5 6 结果为:a = 1, b = 2, x = 3, y = 4, z = 5 若将上述语句改为: scanf("%d %d\n" , &a , &b); scanf("%d %d %d" , &x , &y , &z); 对同样的输入,其结果为a = 1,b = 2,x = 4,y = 5,z = 6,由于在第一个scanf的最后有一个\n,所以第二个scanf语句将从第二个输入行获得数据。 (3) 可打印字符 例如:scanf("%d,%d,%c",&a,&b,&ch); 当输入为: 1, 2, q 即:a = 1,b = 2,ch = q 若输入为1 2 q
除a = 1正确赋值外,对b与c h的赋值都将以失败告终,也就是说,这些不打印字符应是输入数据分隔符,scanf在读入时自动去除与可打印字符相同的字符。
[例3-1] 试编写求梯形面积的程序,数据由键盘输入。 分析:设梯形上底为A,下底为B,高为H面职为S,则 S=(A+B)×H÷2 程序如下: main( ) { float a,b,h,s; printf("please input a,b,h:"); scanf("%f %f %f" , &a , &b , &h); s = 0.5 * (a + b) * h; printf("a=%5.2f b=%5.2f h=%5.2f",a,b,h); printf("s = %7.4f" , s ) ; } 运行结果如下: please input a,b,h:3.5 4.2 2.8 a=3.50 b=4.20 h=2.80 s = 10.7800
3.2.2 printf( )函数 与格式化输入函数scanf( )相对应的是格式化输出函数printf( ),其功能为按控制字符串规定的格式,向缺省输出设备(一般为显示器)输出在输出项列表中列出的各输出项,其基本格式为: printf(“控制字符串”,输出项列表) 输出项可以是常量、变量、表达式,其类型与个数必须与控制字符串中格式字符的类型、个数一致、当有多个输出项时,各项之间用逗号分隔。控制字符串必须用双引号括起,由格式说明和普通字符两部分组成。 1. 格式说明 一般格式为: % [ <修饰符> ] <格式字符> 格式字符规定了对应输出项的输出格式,常用格式字符见表3 - 2。 表3-2 输出格式字符
格式字符 |
意义 |
格式字符 |
意义 |
c |
按字符型输出 |
o |
按八进制整数输出 |
d |
按十进制整数输出 |
x |
按十六进制整数输出 |
u |
按无符号整数输出 |
s |
按字符串输出 |
f |
按浮点型小数输出 |
g |
按e和f格式中较短的一种输出 |
e |
按科学计数法输出 |
|
|
修饰符是可选的,用于确定数据输出的宽度、精度、小数位数、对齐方式等,用于产生 更规范整齐的输出,当没有修饰符时,以上各项按系统缺省设定显示。 (1) 字段宽度修饰符 表3 - 3列出了字段宽度修饰符。 表3-3 字段宽度修饰符
修饰符 |
格式说明 |
意义 |
M |
%md |
以宽度m输出整型数,不足m时,左补空格 |
0m |
%0md |
以宽度m输出整型数,不足m时,左补零 |
m,n |
%m.nf |
以宽度m输出实型小数,小数位为n位 |
例如:设i = 123,a = 12.34567, 则: printf("%4d +++ %5.2f",i,a); 输出: 123 +++ 12.35 printf("%2d +++ %2.1f",i,a ) ; 输出: 123 +++ 12.3 可以看出,当指定场宽小于数据的实际宽度时,对整数,按该数的实际场宽输出,对浮点数,相应小数位的数四舍五入。例如: 1 2 . 3 4 5 6 7按%5.2f 输出,输出1 2 . 3 5。若场宽小于等于浮点数整数部分的宽度,则该浮点数按实际位数输出,但小数位数仍遵守宽度修饰符给出的值。如上面的1 2 . 3 4 5 6 7按%2.1f 输出,结果为:1 2 . 3。 在实际应用中,还有一种更灵活的场宽控制方法,用常量或变量的值作为输出场宽,方法是以一个" * "作为修饰符,插入到%之后。 例如:i = 123; printf("%*d" , 5 , i); 此处,5为场宽,输出为 123 在程序中,可以用一个整形变量K来指示场宽: printf("%*d" , k , i ) ; 可以根据k的值动态地决定i的显示场宽,这在解某些问题时是相当有用的。 (2) 对齐方式修饰符 负号“-”为“左对齐”控制符,一般所有输出数据为右对齐格式,加一个“ -”号,则变为“左对齐”方式。 例如: i=123,a = 12.34567 printf("%4d %10.4f",i,a); 输出为: 12312.3457 printf("%-4d %10.4f",i,a); 输出为: 12312.3457 printf("%4d %-10.4f",i,a); 输出为: 12312.3457 (3) l和h 可以与输出格式字符d、f、u等连用,以说明是用long型或short型格式输出数据,如: %hd 短整型 %lf 精度型 %ld 长整型 %hu 无符号短整型
2. 普通字符 普通字符包括可打印字符和转义字符,可打印字符主要是一些说明字符,这些字符按原样显示在屏幕上,如果有汉字系统支持,也可以输出汉字。 转义字符是不可打印的字符,它们其实是一些控制字符,控制产生特殊的输出效果。 例如:i = 123,n = 456,a = 12.34567,且i为整型,n为长整型。 printf("%4d \t%7.4f \n \t %lu \n" , i , a , n ) ; 输出为: 12312.3457 456 其中\t为水平制表符,作用是跳到下一个水平制表位,在各个机器中,水平制表位的宽度是不一样的,这里设为8个字符宽度,那么“ \t”跳到下一个8的倍数的列上。 “\n”为回车换行符,遇到“ \n”,显示自动换到新的一行。 在c语言中,如果要输出%,则在控制字符中用两个%表示,即%%。
[例3-2] 输出格式控制符的使用。 # include<stdio.h> main( ) { int a; long int b; short int c; unsigned int d;
char e; float f; double g; a = 1023; b = 2222; c = 123; d = 1234; e = 'x'; f = 3.1415926535898; g = 3.1415926535898; printf("a = %d \n" , a); printf("a = %0 \n" , a); printf("a = %x \n" , a); printf("b = %ld \n" , b); printf("c = %d \n" , c); printf("d = %u \n" , d); printf("e = %c \n" , e); printf("f = %f \n" , f); printf("g = %f \n" , g); printf("\n"); } 执行程序,输出为: a = 1023 a = 1777 a = 3ff b = 2222 c = 123 d = 1234 e = x f = 3.141593 g = 3.141593
3.2.3 getchar()函数与putchar()函数 putchar() 与getchar( )是对单个字符进行输入输出的函数。 getchar( )的功能是返回键盘输入的一个字符,它不带任何参数,其通常格式如下: ch = getchar( ) ch为字符型变量,上述语句接收从键盘输入的一个字符并将它赋给ch。 putchar( )的作用是向屏幕上输出一个字符,它的功能与printf函数中的%c相当。putchar( )必须带输出项,输出项可以是字符型常量、变量、表达式,但只能是单个字符而不能是字符串。
[例3-3] 输入一个字符,回显该字符并输出其A S C I I码值。 #include<stdio.h> main( ) { char ch; ch = getchar( ) ; putchar(ch); printf("%d \n" , ch); } 运行程序: g g 103 需要注意的是,字符输入输出函数定义在头文件stdio.h中,故当程序中使用putchar( )或getchar( )函数时,必须在main( )之前用语句: #include<stdio.h> 将 stdio.h包含进来。
3.2.4 程序应用举例 [例3-4] 下面的程序是一个复数加法的例子。 #include <stdio.h> main( ) { float a1,b1,a2,b2; char ch; printf("\t\t\tcomplexs Addition\n"); printf("please input the first complex:\n"); printf("\t realpart:"); scanf("%f" , &a1); printf("\t virtualpart:"); scanf("%f" , &b1); printf("%5.2f +i %5.2f\n",a1,b1); printf("\n please input the second complex:\n"); printf("\t realpart:"); scanf("%f",&a2); printf("\t virtualpart :"); scanf("%f" , &b2); printf("%5.2f +i %5.2f\n",a2,b2); printf("\n The addition is :"); printf("%6.3f +i %6.3f\n",a1+a2,b1+b2); printf(" program normal terminated,press enter..."); ch = getchar( ) ; ch=getchar(); } 运行结果如下: complexs addition please input the first complex : realpart :1.2 virtualpart :3.4 1.20 +i 3.40 please input the second complex : realpart:5.6 virtualpart:7.8 5.60 +i 7.80 The addition is:6.800 +i 11.200 program normal terminated, press enter....
|