在程序的運(yùn)行過(guò)程中,往往需要由用戶輸入一些數(shù)據(jù),而程序運(yùn)算所得到的計(jì)算結(jié)果等又需要輸出給用戶,由此實(shí)現(xiàn)人與計(jì)算機(jī)之間的交互,所以在程序設(shè)計(jì)中,輸入輸出語(yǔ)句是一類必不可少的重要語(yǔ)句,在C語(yǔ)言中,沒(méi)有專門(mén)的輸入輸出語(yǔ)句,所有的輸入輸出操作都是
通過(guò)對(duì)標(biāo)準(zhǔn)I/O庫(kù)函數(shù)的調(diào)用實(shí)現(xiàn)。最常用的輸入輸出函數(shù)有scanf()、printf()、getchar()和putchar(),以下分別介紹。
3.2.1scanf()函數(shù)
格式化輸入函數(shù)scanf()的功能是從鍵盤(pán)上輸入數(shù)據(jù),該輸入數(shù)據(jù)按指定的輸入格式被賦給相應(yīng)的輸入項(xiàng)。函數(shù)一般格式為:
scanf(“控制字符串”,輸入項(xiàng)列表);
其中控制字符串規(guī)定數(shù)據(jù)的輸入格式,必須用雙引號(hào)括起,其內(nèi)容是由格式說(shuō)明和普通字符兩部分組成。輸入項(xiàng)列表則由一個(gè)或多個(gè)變量地址組成,當(dāng)變量地址有多個(gè)時(shí),各變量地址之間用逗號(hào)“,”分隔。
scanf()中各變量要加地址操作符,就是變量名前加“&”,這是初學(xué)者容易忽略的一個(gè)問(wèn)題。應(yīng)注意輸入類型與變量類型一致。
下面探討控制字符串的兩個(gè)組成部分:格式說(shuō)明和普通字符。
1.格式說(shuō)明
格式說(shuō)明規(guī)定了輸入項(xiàng)中的變量以何種類型的數(shù)據(jù)格式被輸入,形式是:
% [ <修飾符> ] <格式字>
各個(gè)格式字符及其意義見(jiàn)表3 – 1。
3.2.2printf()函數(shù)
與格式化輸入函數(shù)scanf()相對(duì)應(yīng)的是格式化輸出函數(shù)printf(),其功能為按控制字符串規(guī)定的格式,向缺省輸出設(shè)備(一般為顯示器)輸出在輸出項(xiàng)列表中列出的各輸出項(xiàng),其基本格式為:
printf(“控制字符串”,輸出項(xiàng)列表)
輸出項(xiàng)可以是常量、變量、表達(dá)式,其類型與個(gè)數(shù)必須與控制字符串中格式字符的類型、
個(gè)數(shù)一致、當(dāng)有多個(gè)輸出項(xiàng)時(shí),各項(xiàng)之間用逗號(hào)分隔。
控制字符串必須用雙引號(hào)括起,由格式說(shuō)明和普通字符兩部分組成。
1.格式說(shuō)明
一般格式為:
%[<修飾符>]<格式字符>
格式字符規(guī)定了對(duì)應(yīng)輸出項(xiàng)的輸出格式,常用格式字符見(jiàn)表3-2。
可以看出,當(dāng)指定場(chǎng)寬小于數(shù)據(jù)的實(shí)際寬度時(shí),對(duì)整數(shù),按該數(shù)的實(shí)際場(chǎng)寬輸出,對(duì)浮點(diǎn)數(shù),相應(yīng)小數(shù)位的數(shù)四舍五入。例如:12.34567按%5.2f輸出,輸出12.35。若場(chǎng)寬小于等于浮點(diǎn)數(shù)整數(shù)部分的寬度,則該浮點(diǎn)數(shù)按實(shí)際位數(shù)輸出,但小數(shù)位數(shù)仍遵守寬度修飾符給出的值。如上面的12.34567按%2.1f輸出,結(jié)果為:12.3。
在實(shí)際應(yīng)用中,還有一種更靈活的場(chǎng)寬控制方法,用常量或變量的值作為輸出場(chǎng)寬,方法是以一個(gè)”*”作為修飾符,插入到%之后。
例如:i=123;
printf(“%*d”,5,i);
longintb;
shortintc;
unsignedintd;
chare;
floatf;
doubleg;
a=1023;
b=2222;
c=123;
d=1234;
e=’x’;
f=3.1415926535898;
g=3.1415926535898;
printf(“a=%dn”,a);
printf(“a=%0n”,a);
printf(“a=%xn”,a);
printf(“b=%ldn”,b);
printf(“c=%dn”,c);
printf(“d=%un”,d);
printf(“e=%cn”,e);
printf(“f=%fn”,f);
printf(“g=%fn”,g);
printf(“n”);
}
執(zhí)行程序,輸出為:
RUN?
a=1023
a=1777
a=3ff
b=2222
c=123
d=1234
e=x
f=3.141593
g=3.141593
3.2.3getchar()函數(shù)與putchar()函數(shù)
putchar()與getchar()是對(duì)單個(gè)字符進(jìn)行輸入輸出的函數(shù)。
getchar()的功能是返回鍵盤(pán)輸入的一個(gè)字符,它不帶任何參數(shù),其通常格式如下:
ch=getchar()
ch為字符型變量,上述語(yǔ)句接收從鍵盤(pán)輸入的一個(gè)字符并將它賦給ch。
putchar()的作用是向屏幕上輸出一個(gè)字符,它的功能與printf函數(shù)中的%c相當(dāng)。putchar()必
須帶輸出項(xiàng),輸出項(xiàng)可以是字符型常量、變量、表達(dá)式,但只能是單個(gè)字符而不能是字符串。
[例3-3]輸入一個(gè)字符,回顯該字符并輸出其ASCII碼值。
#include<stdio.h>
main()
{
charch;
ch=getchar();
putchar(ch);
printf(“%dn”,ch);
}
運(yùn)行程序:
RUN?
g?
g103
需要注意的是,字符輸入輸出函數(shù)定義在頭文件stdio.h中,故當(dāng)程序中使用putchar()或
getchar()函數(shù)時(shí),必須在main()之前用語(yǔ)句:
#include”stdio.h”
將stdio.h包含進(jìn)來(lái)。
3.2.4程序應(yīng)用舉例
[例3-4]下面的程序是一個(gè)復(fù)數(shù)加法的例子。
#include<stdio.h>
main()
{
floata1,b1,a2,b2;
charch;
printf(“tttcomplexsAdditionn”);
printf(“pleaseinputthefirstcomplex:n”);
printf(“trealpart:”);
scanf(“%f”,&a1);
printf(“tvirtualpart:”);
scanf(“%f”,&b1);
printf(“%5.2f+i%5.2fn”,a1,b1);
printf(“npleaseinputthesecondcomplex:n”);
printf(“trealpart:”);
scanf(“%f”,&a2);
printf(“tvirtualpart:”);
scanf(“%f”,&b2);
printf(“%5.2f+i%5.2fn”,a2,b2);
printf(“nTheadditionis:”);
printf(“%6.3f+i%6.3fn”,a1+a2,b1+b2);
printf(“programnormalterminated,pressenter…”);
ch=getchar();
ch=getchar();
}
運(yùn)行結(jié)果如下:
RUN?
complexsaddition
pleaseinputthefirstcomplex:
realpart:1.2
virtualpart:3.4
1.20+i3.40
pleaseinputthesecondcomplex:
realpart:5.6
virtualpart:7.8
5.60+i7.80
Theadditionis:6.800+i11.200
programnormalterminated,pressenter….