二、格式字串
在Turbo C中格式字串的一般形式為: [標誌][輸出最小寬度][.精度][長度]類型 其中方括弧[]中的項為可選項。各項的意義介紹如下:
1.類型類型字元用以表示輸出資料的類型,其格式符和意義下表所示:
表示輸出類型的格式字元 格式字元意義
d 以十進位形式輸出帶正負號的整數(正數不輸出符號)
o 以八進位形式輸出不帶正負號的整數(不輸出首碼O)
x 以十六進位形式輸出不帶正負號的整數(不輸出首碼OX)
u 以十進位形式輸出不帶正負號的整數
f 以小數形式輸出單、雙精確度實數
e 以指數形式輸出單、雙精確度實數
g 以%f%e中較短的輸出寬度輸出單、雙精確度實數
c 輸出單個字元
s 輸出字串
2.標誌
標誌字元為-、+、#、空格四種,其意義下表所示:
標誌格式字元 標 志 意 義
- 結果靠左對齊,右邊填空格
+ 輸出符號(正號或負號)空格輸出值為正時冠以空格,為負時冠以負號
# 對c,s,d,u類無影響;對o類, 在輸出時加前
綴o 對x類,在輸出時加首碼0x;對e,g,f 類當結果有小數時才給出小數點
3.輸出最小寬度
用十進位整數來表示輸出的最少位元。 若實際位元多於定義的寬度,則按實際位元輸出, 若實際位元少於定義的寬度則補以空格或0。
4.精度
精度格式符以“.”開頭,後跟十進位整數。本項的意義是:如果輸出數字,則表示小數的位元;如果輸出的是字元, 則表示輸出字元的個數;若實際位元大於所定義的精度數,則截去超過的部分。
5.長度
長度格式符為h,l兩種,h表示按短整型量輸出,l表示按長整型量輸出。
void main(){
int a=15;
float b=138.3576278;
double c=35648256.3645687;
char d='p';
printf("a=%d,%5d,%o,%x\n",a,a,a,a);
printf("b=%f,%lf,%5.4lf,%e\n",b,b,b,b);
printf("c=%lf,%f,%8.4lf\n",c,c,c);
printf("d=%c,%8c\n",d,d);
} a<--15
b<--138.3576278
c<--35648256.3645687
d<--'p'
main()
{
int a=29;
float b=1243.2341;
double c=24212345.24232;
char d='h';
printf("a=%d,%5d,%o,%x\n",a,a,a,a);
printf("b=%f,%lf,%5.4lf,%e\n",b,b,b,b);
printf("c=%lf,%f,%8.4lf\n",c,c,c);
printf("d=%c,%8c\n",d,d);
}
本例第七行中以四種格式輸出整型變數a的值,其中“%5d ”要求輸出寬度為5,而a值為15隻有兩位故補三個空格。 第八行中以四種格式輸出實型量b的值。其中“%f”和“%lf ”格式的輸出相同,說明“l”符對“f”類型無影響。“%5.4lf”指定輸出寬度為5,精度為4,由於實際長度超過5故應該按實際位元輸出,小數位元超過4位部分被截去。第九行輸出雙精確度實數,“%8.4lf ”由於指定精度為4位故截去了超過4位的部分。第十行輸出字元量d,其中“%bc ”指定輸出寬度為8故在輸出字元p之前補加7個空格。
使用printf函數時還要注意一個問題, 那就是輸出表列中的求值順序。不同的編譯系統不一定相同,可以從左至右, 也可從右至左。Turbo C是按從右至左進行的。如把例2.13改寫如下述形式:
void main(){
int i=8;
printf("%d\n%d\n%d\n%d\n%d\n%d\n",++i,--i,i--,i++,-i--);
} i<--8
這個程式與例2.13相比只是把多個printf語句改一個printf 語句輸出。但從結果可以看出是不同的。為什麼結果會不同呢?就是因為printf函數對輸出表中各量求值的順序是自右至左進行 的。在式中,先對最後一項“-i--”求值,結果為-8,然後i自減1後為7。 再對“-i++”項求值得-7,然後i自增1後為8。再對“i--”項求值得8,然後i再自減1後為7。再求“i++”項得7,然後I再自增1後為8。 再求“--i”項,i先自減1後輸出,輸出值為7。 最後才求輸出表列中的第一項“++i”,此時i自增1後輸出8。但是必須注意, 求值順序雖是自右至左,但是輸出順序還是從左至右, 因此得到的結果是上述輸出結果。
字元輸出函數
putchar 函數
putchar 函數是字元輸出函數, 其功能是在顯示器上輸出單個字元。其一般形式為: putchar(字元變數) 例如:
putchar('A'); 輸出大寫字母A
putchar(x); 輸出字元變數x的值
putchar('\n'); 換行 對控制字元則執行控制功能,不在螢幕上顯示。 使用本函數前必須要用檔案包含命令:
#include<stdio.h>
void main(){
char a='B',b='o',c='k';
putchar(a);putchar(b);putchar(b);putchar(c);putchar('\t');
putchar(a);putchar(b);
putchar('\n');
putchar(b);putchar(c);
}
資料輸入語句
C語言的資料輸入也是由函數陳述式完成的。 本節介紹從標準輸入裝置—鍵盤上輸入資料的函數scanf和getchar。 scanf函數 scanf函數稱為格式輸入函數,即按使用者指定的格式從鍵盤上把資料輸入到指定的變數之中。
一、scanf函數的一般形式
scanf函數是一個標準庫函數,它的函數原型在標頭檔“stdio.h”中,與printf函數相同,C語言也允許在使用scanf函數之前不必包含stdio.h檔案。scanf函數的一般形式為: scanf(“格式控制字元串”,地址表列); 其中,格式控制字元串的作用與printf函數相同,但不能顯示非格式字串, 也就是不能顯示提示字串。地址表列中給出各變數的地址。 地址是由地址運算子“&”後跟變數名組成的。例如,&a,&b分別表示變數a和變數b 的地址。這個地址就是編譯系統在記憶體中給a,b變數分配的地址。在C語言中,使用了地址這個概念,這是與其它語言不同的。 應該把變數的值和變數的地址這兩個不同的概念區別開來。變數的地址是C編譯系統分配的,使用者不必關心具體的地址是多少。 變數的地址和變數值的關係如下: &a--->a567 a為變數名,567是變數的值,&a是變數a的地址。在賦值運算式中給變數賦值,如: a=567 在賦值號左邊是變數名,不能寫地址,而scanf函數在本質上也是給變數賦值,但要求寫變數的地址,如&a。 這兩者在形式上是不同的。&是一個取地址運算子,&a是一個運算式,其功能是求變數的地址。
void main(){
int a,b,c;
printf("input a,b,c\n");
scanf("%d%d%d",&a,&b,&c);
printf("a=%d,b=%d,c=%d",a,b,c);
}
注意&的用法!
在本例中,由於scanf函數本身不能顯示提示串,故先用printf語句在螢幕上輸出提示,請使用者輸入a、b、c的值。執行scanf語句,則退出TC螢幕進入使用者螢幕等待使用者輸入。使用者輸入7、8、9後按下斷行符號鍵,此時,系統又將返回TC螢幕。在scanf語句的格式串中由於沒有非格式字元在“%d%d%d”之間作輸入時的間隔, 因此在輸入時要用一個以上的空格或斷行符號鍵作為每兩個輸入數之間的間隔。
如: 7 8 9
或
7
8
9