輸入字符getchar()
getchar函數(shù)是對單個字符進行輸入的函數(shù)。它的功能是:從標準輸入設備上(鍵盤)輸入一個且只能是一個字符,并將該字符返回為getchar函數(shù)的值。
格式: getchar()
例如:
char ch;
ch = getchar();
ch為字符型變量,上述語句接收從鍵盤輸入的一個字符并將它賦給ch。
例1:getchar函數(shù)應用。
#include <stdio.h>
main()
{
int i;
i=getchar();
printf("%c:%d\n",i,i);
}
執(zhí)行本程序時,按下字符‘A’并回車后,顯示結果如下:
A:65
在使用getchar函數(shù)時,要注意以下幾點:
1)getchar函數(shù)是不帶參數(shù)的庫函數(shù),但是()不能省略。
2)用戶輸出一個字符后,只當按“回車”鍵之后輸入的字符才有效;
3)getchar函數(shù)只接受一個字符,而非一串字符。上例中:若輸入abcde,getchar函數(shù)也只接受第一個字符‘a’。
4)getchar函數(shù)得到的字符可以賦給一個字符變量或整型變量,也可以不賦給任何變量而是作為表達式的一部分。
5)getchar函數(shù)不能夠顯示輸入的數(shù)據(jù),如果希望顯示該數(shù)據(jù),必須調用相應的輸出函數(shù)(例如putchar()庫函數(shù))來實現(xiàn)。
還有一個與之相接近的函數(shù)是getch()函數(shù)。getch()函數(shù)表示當用戶在鍵盤上輸入一個字符后,該字符立即被計算機接受,可以通過輸出函數(shù)顯示出來,而無需等待“回車”命令。
輸出字符()
函數(shù)是對單個字符進行輸出的函數(shù)。它的功能:將指定表達式的值所對應的字符輸出到標準設備(終端),每次只能輸出一個字符。
格式:putchar(輸出項)
putchar()必須帶輸出項,輸出項可以是字符型常量或變量,putchar函數(shù)功能與printf函數(shù)中的%c相當。
例2:putchar函數(shù)的應用
#include"stdio.h"
main()
{
char o=‘O’,k=’K’;
putchar(o);
putchar(k);
putchar(‘\n’);
putchar(‘*’)
}
執(zhí)行結果為:
OK
*
使用putchar函數(shù)時,應注意以下幾點:
1)輸出的數(shù)據(jù)只能是單個字符,不能是字符串。’abc’或“abc”都是錯誤的。
2)被輸出的字符常量必須用單引號括起來,如:’\n’、’*’。不能用雙引號,導致錯誤。
3)當輸出項是表達式的時候,可以寫成a+’32’等形式,不能寫成a\n等形式。
另外,與putchar函數(shù)的功能和使用方法一樣,putch函數(shù)也可以輸出一個字符。
scanf函數(shù)的調用格式
scanf函數(shù)原型包含在標準輸入輸出頭文件“stdio.h”中。調用格式:
格式:scanf("格式控制字符串",輸入項地址列表);
scanf函數(shù)有兩項參數(shù),用“”引起來的格式控制字符串和需要接收數(shù)據(jù)的內存地址。
格式控制字符串:規(guī)定數(shù)據(jù)輸入的格式,由轉換說明符和普通字符組成,轉換說明符和百分號(%)一起使用,用來說明輸入數(shù)據(jù)的數(shù)據(jù)類型(格式字符)。
輸入項地址列表:需要接收數(shù)據(jù)的變量地址,這些輸入項與格式控制字符串在類型和數(shù)量上要對應,當有多個輸入項時,各個地址名之間以逗號“,”分隔。輸入格式和變量類型要保持一致。
在C語言中,一個變量的地址可以通過地址運算符&得到。例如:定義int a,b;則a,b的地址為&a,&b。(見指針一章)
scanf()函數(shù)中的輸入項是變量地址,輸入數(shù)據(jù)將被放入變量地址所指示的內存單元中,所以在變量前要加地址運算符“&”。
提示
忘記變量前加地址操作符“&”是初學時容易犯的一個錯誤。現(xiàn)階段只要記住scanf語句中的每個變量名前面都要有&,例外的情況在以后討論。
——摘自高克寧 雒興剛主編《高級語言程序設計》
scanf函數(shù)的格式說明
格式說明字符串規(guī)定了輸入項中的變量將以何種類型的數(shù)據(jù)格式(由轉換說明符給出)被輸入,格式控制字符串的一般形式:
% [修飾符] 轉換說明符
其中修飾符為任選項。
1)格式轉換說明符:用于指定相應輸入項內容的輸入格式,常用格式見下表1。表1 scanf函數(shù)轉換說明符 格式
意義
d
輸入一個十進制整數(shù)
o
輸入一個八進制整數(shù)
x
輸入一個十六進制整數(shù)
i
輸入一個有符號或無符號的十進制、八進制、十六進制整數(shù)
u
輸入一個無符號十進制整數(shù)
f 、e或E、 g或G
輸入一個小數(shù)形式或指數(shù)形式的浮點數(shù)
c
輸入一個字符
s
輸入一個字符串
例如:
int x;
scanf(“%d”,&x);
它有兩個參數(shù)“%d”和&x,第一個參數(shù)是格式控制字符串,由%后接一個類型轉換說明符構成,指出用戶應該輸入的數(shù)據(jù)類型,轉換說明符%d說明輸入的數(shù)據(jù)應該是一個整數(shù)。第二個參數(shù)是變量x的地址,&與變量名連用是將變量x的內存地址告訴scanf函數(shù),計算機然后就會將輸入的數(shù)據(jù)存儲在這個地址單元中。
計算機在執(zhí)行scanf語句時,等待用戶輸入變量x的值,用戶通過鍵入一個整數(shù)并按下回車鍵響應請求,計算機把用戶的輸入值賦給變量x,操作完成后,對x的引用就會使用這個值。scanf函數(shù)(及后面學習的printf函數(shù))提高了用戶與計算機之間的交互性。
在有多個輸入項時,如果格式控制字符串中沒有普通字符或轉義字符作為讀入數(shù)據(jù)之間的分隔符,則一般采用空格符、<Tab>符或回車鍵作為讀入數(shù)據(jù)的分隔符,當C語言的編譯系統(tǒng)空格符、<Tab>符或回車鍵以及非法字符時,會自動認為數(shù)據(jù)輸入結束。計算機等待所有的數(shù)據(jù)輸入結束后的最后一次<回車鍵>,將讀入的數(shù)據(jù)分別付給對應的變量所指定的內存單元。如果數(shù)據(jù)的輸入少于格式控制字符串中指定的轉換說明符的個數(shù),則計算機將一直等待數(shù)據(jù)的輸入,直到所有數(shù)據(jù)全部被鍵入為止。
例如:
int x,y;
scanf(“%d%d”,&x,&y);
讀入數(shù)據(jù)的方式可以是:
1<空格>2<回車>
或者
1<回車>
2<回車>
或者
1 <Tab>2<回車>
采用“%d%d”形式的格式字時,不能使用其它的數(shù)據(jù)讀入方式。例如:1,2<回車>,會使得只有1被送入x單元,而y單元不能夠得到數(shù)據(jù)2。
但是,在輸入多個帶有字符型數(shù)據(jù)時,若以空格符作為分隔符,可能產生非預期的結果。此時,空格將被作為有效字符處理。
例如:
int a;
char ch;
scanf(“%d%c”,&a,&ch);
如果數(shù)據(jù)讀入方式為:123<空格>a<回車>,本意是期望變量a的值為數(shù)值32,變量ch的值為字符a,但實際上用于分隔數(shù)據(jù)的空格被作為有效字符數(shù)據(jù)讀入并賦予給字符變量ch。為了避免這種情況,可以在格式控制字符串中加入空格作為分隔符。將上面例句改為:scanf(“%d %c”,&a,&ch);此處的%d后的空格,就可以跳過字符‘a’前所有的空格,從而保證非空格數(shù)據(jù)的正確錄入。
2)修飾符
scanf函數(shù)的修飾符有:數(shù)據(jù)讀入寬度(域寬)、*和長度。修飾符和意義見下表2。
表2 修飾符以及意義
標識符
意義
域寬
指定輸入數(shù)據(jù)的寬度
*
跳過相應數(shù)據(jù)不作處理
l或h
讀入長整型、雙精度型或短整型數(shù)據(jù)
①域寬
可以用一個十進制數(shù)指定輸入數(shù)據(jù)的數(shù)據(jù)寬度,系統(tǒng)自動按域寬截取輸入數(shù)據(jù)。
例如:
int a;
scanf(“%3d”,&a);
表示按寬度3輸入一個整數(shù)給變量a。如果讀入數(shù)據(jù)為:123456<回車>,則變量a實際接收的值為123。
例如:
int a,b,c;
scanf(“%2d%3d%4d”,&a,&b,&c);
如果讀入數(shù)據(jù)為:123456789<回車>,則變量a、b 、c 的值分別是12、345和6789??梢詫崿F(xiàn)數(shù)據(jù)的自動截取。 ②字符*
*表示按指定格式讀入數(shù)據(jù)但不賦予相應的變量,作用是跳過相應的讀入數(shù)據(jù)。
例如:
int a,b,c;
scanf(“%d%*d%d”,&a,&b,&c);
執(zhí)行該語句,若輸入為1? 2? 3<回車>,結果為a=1,b=3,c未賦值,2被跳過。
例1:一個實際問題——處理一個日期數(shù)據(jù)。
假設日期讀入的格式為: 12-2-2003或12/02/2003,該數(shù)據(jù)格式中的年、月、日三個數(shù)據(jù)需要保存,但是連接年、月、日數(shù)據(jù)的連接符需要被廢棄。
當用戶以12-02-2003形式鍵入日期數(shù)據(jù)時,該數(shù)據(jù)中的每一個數(shù)值(年、月、日)需要被讀入對應的變量year、month、date內存單元中,為了去掉不需要的將年、月、日數(shù)據(jù)分開的連接符,直接方法是將這些字符包含在scanf的格式控制串中。
例如將語句寫成:scanf(“%d─%d─%d’,&date,&month,&year);這條語句可以去掉以12-2-2003形式讀入數(shù)據(jù)中的連字符,但是當用戶輸入如下格式的日期數(shù)據(jù)::12/2/2003或12:2:2003時,該語句語句不僅不能去掉不需要的字符(/或:),還會造成數(shù)據(jù)錯誤(只能正確得到date數(shù)據(jù))。如果在輸入格式字符串中使用scanf函數(shù)提供的*,將語句寫成:
scanf(“%d%*c%d%*c%d’,&date,&month,&year);就能夠從輸入數(shù)據(jù)中讀取有效數(shù)據(jù)并廢棄任何%*c所指定的數(shù)據(jù)(不將其賦給某個變量)。
程序清單如下:
#include<stdio.h>
main( )
{
int month, day,yaer;
printf("Enter a date in the form d-m-y:");
scanf("%d%*c%d %*c%d",&date,&month,,&year);
printf("date=%d month=%d year=%d\n",date ,month,year);
}
運行結果:
Enter a date in the from d-m-y:12/3/2003
day=12,month=3,year=2003
③l和h
用于說明輸入的數(shù)據(jù)時長整型(l)或短整型(h)。l和h可以和轉換說明符d、o、x一起使用,形式為%ld、%lo、%lx、%hd、%ho、%hx,此外l還可以與f或e一起(%lf或%le)表示輸入double型數(shù)據(jù)。
例如:
long a;
short b;
scanf(“%10ld%hd”,&a,&b);
表示變量a的數(shù)據(jù)按寬度為10的長整型讀入,而變量b的數(shù)據(jù)按短整型讀入。
3)普通字符(非格式字符)
格式控制字符串中除了格式字與修飾符外,還可以包含普通字符,這些普通字符包括:可打印字符、空格和轉義字符。
①可打印字符:對scanf函數(shù),如果格式控制字符串中的說明符之間包含有其他字符,那么在輸入數(shù)據(jù)時,必須在相應位置讀入這些字符。
例如 :
int a,b;
scanf(“%d,%d”,&a,&b);
若數(shù)據(jù)輸入:1<空格>2;則只有變量a的數(shù)據(jù)是正確的,變量b則會發(fā)生錯誤。這是因為格式控制字符串中存在可打印字符“,”,所以在讀入數(shù)據(jù)時,必須以“,”作為輸入數(shù)據(jù)的分隔符。
正確地讀入數(shù)據(jù)方式應為:1,2<回車>
又如:scanf(“a=%d,b=%f,c=%c”,&a,&b,&c);當輸入為:1,2,a時,雖然采用了“,”分隔數(shù)據(jù),但也會產生錯誤,因為在格式控制字符串中還有其他的可打印字符(如:“a=”,“b=”,“c=”等)。也就是說,這些字符作為輸入數(shù)據(jù)的分隔符,在scanf函數(shù)讀入數(shù)據(jù)時自動去掉。因此正確地數(shù)據(jù)讀入方式應為:a=1,b=2.1,c=a<回車>
②空格
格式控制字符串中的空格可以分隔數(shù)據(jù),在多個數(shù)據(jù)輸入過程中,如果沒有普通字符做數(shù)據(jù)的分隔符,則在數(shù)值數(shù)據(jù)輸入時,可以用空格作為讀入數(shù)據(jù)的分隔符,但在字符數(shù)據(jù)輸入時,空格則不能作為數(shù)據(jù)之間的分隔符,它將被作為有效數(shù)據(jù)處理。
③轉義字符
在以%c格式的數(shù)據(jù)讀入中,轉義字符被作為有效字符處理。而在格式控制字符串中的轉義字符具有輸入轉義字符所代表的控制代碼或特殊字符的功能。
請分析下面程序代碼:
main()
{
int a,b;
scanf("%d%d\n",&a,&b);
printf("a=%d,b=%d\n",a,b);
}
如果輸入1 2,會發(fā)生什么現(xiàn)象?應該怎樣讀入數(shù)據(jù),才能得到執(zhí)行結果?
提示 盡量不要在scanf()函數(shù)的格式控制字符串中出現(xiàn)普通字符,特別是轉義字符,它會增加讀入數(shù)據(jù)的難度并可能造成不可預料的錯誤。
printf函數(shù)的調用格式
printf函數(shù)是一個標準庫函數(shù),能夠以精確的格式輸出程序運算的結果。printf函數(shù)的調用格式為:
printf(“格式控制字符串”,輸出項列表);
printf函數(shù)有兩項參數(shù):用“”引起來的格式控制字符串和向標準設備輸出的數(shù)據(jù)。每次調用printf函數(shù)時都要包含描述輸出格式的 “格式控制字符串”。
格式字符串是由格式字符(包括:轉換說明符、標志、域寬、精度)和普通字符組成,轉換說明符和百分號(%)一起使用,用來說明輸出數(shù)據(jù)的數(shù)據(jù)類型、標志、長度和精度。
輸出項列表可以是常量、變量和表達式,也可以沒有輸出項,這些輸出項必須與格式控制字符串在類型和數(shù)量上完全對應,否則,結果將不可預測。當有多個輸出項時,各個輸出項之間用逗號‘,’分隔。 提示
在開始使用printf函數(shù)時最常犯的錯誤是忘記用雙引號將格式控制字符串括起來。
——摘自高克寧 雒興剛主編《高級語言程序設計》
printf函數(shù)的最簡單的使用
當沒有輸出項時,函數(shù)的參數(shù)只有“格式字符串”。函數(shù)完成的功能就是將“”中的字符串輸出(顯示在屏幕上)。
例1: 輸出字符串hello Cprogramming!
main()
{
printf(“hello Cprogramming!”);
}
可以在顯示器屏幕上看到輸出結果為:hello Cprogramming!
printf函數(shù)永遠不會自動換行,如果想將hello Cprogram!分行輸出,輸出形式如下:
hello
Cprogram!
則需要引入轉移字符\n,或者多次調用printf函數(shù)分段輸出。程序如下:main()
{
printf(“hello\n Cprogram!”);
}
或:
main()
{
printf(“hello\n”);
printf(“Cprogram!”); }
其中:“\n”是一個轉移字符,是控制字符。它的作用是使計算機執(zhí)行printf函數(shù)時,指示從下一行的右邊開始的換新一行輸出。所以顯示器上出現(xiàn)了兩行字符。如果在字符串中忘記了“\n”,那么輸出的結果就沒有換行(盡管可以多次調用printf函數(shù))。例如下面的程序:
main()
{
printf(“hello”);
printf(“Cprogram!”);
}
輸出結果仍為:hello Cprogram!
轉義字符的含義參見下表。
轉義字符
意義
\n
換新行起始符
\r
回車(到本行起始)
\b
退格符
\f
換頁符
\t
橫向制表符
\v
縱向制表符
\\
反斜杠
\'
單引號
\"
雙引號
\?
問號
\0
空字符(NULL)
\ddd
1到3為八進制數(shù)所代表的字符
\xhh
1到2位十六進制樹所代表的字符
轉義字符只能是用小寫字母,每個轉移字符被看成是一個字符常量。如:‘\0’但是:用單引號‘’括起來的一個漢字如‘好’則不是字符常量;同樣用雙引號“”括起來的單個字符如“a” 也不是字符常量,它是字符串常量。
因為雙引號“”、單引號‘’、反斜杠\等在C語言中的特殊作用,如果要在字符串重新打印這些字符,則不能直接使用這些字符,而要使用轉義字符“\””、“\’”、“\\”等。
例如:輸出“hello Cprogram!”,程序應改為:
main()
{
printf(“\”hello Cprogram!\””);
}
提示
可以在printf()函數(shù)中適當?shù)倪\用轉義字符,以增加輸出效果。但是要注意每個轉義字符的不同含義,不要弄混。
——摘自高克寧 雒興剛主編《高級語言程序設計》
格式化輸出在使用printf函數(shù)時,當系統(tǒng)遇到輸出的轉換說明符后,會自動用后面對應的輸出項的值代替它的位置,然后輸出。格式控制字符串中的轉換字符應與輸出列表中的待輸出項之間應一一對應,這些轉換字符控制對應的輸出項以該格式輸出。數(shù)據(jù)類型必須與格式符相匹配。
格式控制字符串的一般形式:
% [修飾符] 轉換說明符
其中修飾符為可選項,包括標志修飾符、寬度修飾符、精度修飾符、長度修飾符,用于確定輸出數(shù)據(jù)的寬度、精度、對齊方式等,用于產生更加規(guī)范、整齊、美觀的數(shù)據(jù)輸出形式,當沒有修飾符時,以上各項按系統(tǒng)缺省值設定顯示。
1)轉換說明符
轉換說明符規(guī)定了對應輸出項的輸出格式,即將輸出的數(shù)據(jù)轉換為指定的格式輸出。該項不能省略。常用的轉換說明符及其含義見表1。表1 轉換說明符及其含義 轉換說明符
意義
C
按字符型輸出
d或i
按十進制整數(shù)輸出
u
按無符號十進制整數(shù)輸出
f
按浮點型小數(shù)輸出
E或e
按指數(shù)形式(科學計數(shù)法)輸出
o
按八進制整數(shù)輸出(不輸出前綴o)
X或x
按十六進制整數(shù)輸出(不輸出前綴ox)
s
按字符串輸出
G或g
按e和f格式中輸出寬度較短的一種形式輸出
轉換說明符要與%一起使用,不能省略%。上表中的字符只有放在%的后面才作為輸出的轉換說明。
例如:
int max;
printf(“%d”,max);
表示變量max的值以十進制整數(shù)形式輸出。
又如:
int d=15;
printf(“d=%d”,d);
在該格式控制字符串中,第1個d不是輸出格式字而是一個普通字符,需要按原字符形式輸出,第3個d是一個變量名,是輸出項,只有放在%后的第2個d才是轉換說明符, 說明變量d的值(15)以十進制整數(shù)形式輸出。輸出格式是:d=15。
提示
printf()函數(shù)中的格式字中,除格式說明符E、G、X外,其它格式說明符必須小寫。
例1:輸出格式控制符的使用。
main( )
{
int a1=+400,a2=-400;
float b=3.1415926,e=31415.26535898;
float g=3.140000;
char c='a';
double d=3.1415926535898;
printf("a1=%d\n",a1);
printf("a1=%o\n",a1);
printf("a1=%x\n",a1);
printf("a1=%u\n",a1);
printf("a2=%d\n",a2);
printf("a2=%u\n",a2);
printf("b=%f\n",b);
printf("e=%e\n",e);
printf("g=%g\n",g);
printf("d=%f\n",d);
printf("c=%c\n",c);
printf("s=%s\n", "Cprogram");
}
執(zhí)行程序,輸出結果為:
a1=400
a1=620
a1=190
a1=400
a2=-400
a2=65136
b=3.141593
e=3.141593e+04
g=3.14
d=3.141593
c=a
s=Cprogram
從輸出結果可以看出:只有減號(-)才會被打印出來,加號(+)是不打印的。?使用%u格式控制符打印正整數(shù)時,該數(shù)不發(fā)生變化,但是打印負整數(shù)時,該負整數(shù)將被轉換為無符號整數(shù)并打印出來。?缺省情況下,使用%f、%e、%E打印出來的值帶有6個小數(shù)位,如果小數(shù)位數(shù)不夠6位,則在最后添0補位。?單精度數(shù)一般有7位有效數(shù)位。使用%e和%E打印的帶有指數(shù)的值,在指數(shù)前打印出字母e或E,同時小數(shù)點左側的數(shù)字僅打印一位(科學計數(shù)法)。雙精度數(shù)可以用%f格式輸出,它的有效位一般為16位,6位小數(shù)位。 %g不打印輸出數(shù)據(jù)的小數(shù)部分尾部的0。
一個轉換說明符是以%開始,以表3-2中的字符結束。其中可以插入修飾符。
2)長度修飾符
常用的長度修飾符有兩種:l(長)表示按長整型量輸出,h(短)表示按短整型量輸出??梢院洼敵鲛D換說明符d、f、u等連用。其用法和含義見表2。
表2 長度修飾符的意義
格式
意義
%ld
用于長整型數(shù)據(jù)的輸出
%hd
用于短整型數(shù)據(jù)的輸出
%lf
用于雙精度型數(shù)據(jù)的輸出
例2:長度修飾符的使用。
main()
{
long int a=1234567;
int b=12345;
double d=1234567.123456789;
printf("a=%ld\n",a);
printf("b=%hd\n",b);
printf("d=%lf\n",d);
}
執(zhí)行程序,結果如下:
a=1234567
b=12345
d=1234567.123457
例3:讀入數(shù)據(jù)與輸出數(shù)據(jù)類型的匹配。
main( )
{
int a;
printf(“enter a data:\n”);
scanf("%d",&a);
printf("%d\n",a);
}
程序運行結果:
enter a data:
100000000
-520036096
由于輸入數(shù)據(jù)的類型為整型,讀入的數(shù)據(jù)本身已超出基本整型范圍,使計算結果發(fā)生錯誤,同時,輸出函數(shù)的輸出格式字為長整型,造成輸出結果與輸入數(shù)據(jù)不相符。因此應將程序修改如下:
main( )
{
long int a;
clrscr();
printf("enter a data:\n");
scanf("%ld",&a);
printf("%ld\n",a);
}
enter a data:
10000000l
10000000
提示
輸入長整型數(shù)據(jù)時,應在數(shù)據(jù)的后面加上字母‘l’或‘L’。
3)寬度修飾符和精度修飾符
寬度修飾符用來指定printf()函數(shù)輸出數(shù)據(jù)的占位寬度,用一個十進制整數(shù)表示輸出數(shù)據(jù)的位數(shù),插在百分號%與轉換說明符之間,其作用是控制打印數(shù)據(jù)的寬度,也稱為“域寬”。
也可以在prinf函數(shù)中指定輸出數(shù)據(jù)的精度。以一個小數(shù)點開始,后緊跟著一個十進制整數(shù)表示精度,插在百分號%與轉換說明符之間。對于不同數(shù)據(jù)類型,精度的含義也不相同:在使用%d時,精度表示最少要打印的數(shù)字的個數(shù)。在使用%f、%e、%E時,精度是小數(shù)點后面顯示的數(shù)字個數(shù)。在使用%s時,精度表示輸出的字符串中字符的個數(shù)。
提示
scanf不允許指定精度輸入。
寬度和精度也可以同時使用,其使用形式是:域寬.精度。
常用的寬度修飾符與精度修飾符說明以及含義見表3。
表3 寬度修飾符與精度修飾符說明
修飾符及說明格式
意義
%md
以寬度m輸出整型數(shù),不足m位數(shù)時左側補以空格。
%0md
以寬度m輸出整型數(shù),不足m位數(shù)時左側補以0(零)。
%m.nf
以寬度m輸出實型數(shù),小數(shù)位數(shù)為n位。
%ms
以寬度m輸出字符串,不足m位數(shù)時左側補以空格。
%m.ns
以寬度m輸出字符串左側的n個字符,不足m位數(shù)時左側補以空格。
例3:寬度修飾符和精度修飾符的使用。
main()
{
printf("%3d\n",1);
printf("%3d\n",10);
printf("%3d\n",100);
printf("%3d\n",1000);
printf("%0.3d\n",1);
printf("%0.3d\n",10) ;
printf("%0.3d\n",100);
printf("%0.3d\n",1000);
printf("%.3d\n",1);
printf("%.3d\n",10);
printf("%.3d\n",100);
printf("%.3d\n",1000);
printf("%7.2f\n",123.4567);
printf("%5.2f\n",123.4567);
printf("%2.7f\n",123.4567);
printf("%5s\n","Cprogram");
printf("%7.3s\n","Cprogram");
printf("%2.6s\n","Cprogram");
}
執(zhí)行程序,結果如下:
1
10
100
1000
001
010
100
1000
001
010
100
1000
123.46
123.46
123.4567000
Cprogram
Cpr
Cprogr
分析程序的結果,可以看出:
如果被打印的實際數(shù)據(jù)的寬度小于指定的寬度,則缺省下在寬度內為右對齊。左補空格或補0。直到總的數(shù)據(jù)個數(shù)滿足寬度的要求。
當指定的輸出數(shù)據(jù)寬度小于數(shù)據(jù)的實際寬度時,則按實際數(shù)據(jù)的位數(shù)輸出打?。▽挾茸詣釉黾樱粚τ谡麛?shù)而言,按該數(shù)的實際寬度輸出;對于浮點數(shù),按實際位數(shù)輸出,但如果制定了浮點數(shù)的精度,則相應的小數(shù)位按精度的位數(shù)四舍五入;對于字符串,按實際串長度輸出。
通常情況下,精度用于描述浮點數(shù)的小數(shù)位數(shù),但是,當采用精度描述整數(shù)或字符串時,如果被打印的整數(shù)數(shù)據(jù)包含的數(shù)字個數(shù)小于指定的精度,就在被打印數(shù)據(jù)的前面加0,直到總的數(shù)字個數(shù)等于該精度為止。而對于被打印的字符串,則精度確定該字符串左側的字符個數(shù),這些字符輸出在指定域寬的右側。不足域寬位數(shù)時左側補以空格。
在實際程序應用中,還有一種更為靈活的寬度和精度的控制方法,用整型常量或整型變量的值作為輸出數(shù)據(jù)的域寬和精度。方法是以“*”取代域寬修飾符和精度修飾符放在%的后面,以計算出來的整數(shù)表達式的值作為寬度和精度。
例如:
float a=123.45;
printf(“%*.*f”,6,1,a);
此處6為輸出寬度,1為輸出精度,輸出結果為: 123.5,右對齊。
提示
沒有為要打印的數(shù)據(jù)提供足夠大的寬度,使得其他被打印的數(shù)據(jù)發(fā)生位置偏移,從而產生令人費解的輸出格式。
4)標志修飾符
在printf 函數(shù)中,可以使用標志修飾符控制輸出格式。常見的標志修飾符見表4。
表4 標志修飾符及其作用
標志修飾符
意義
-
“左對齊”方式:輸出數(shù)據(jù)左對齊,右側補空格。缺省時輸出數(shù)據(jù)則為右對齊,左補格。
+
輸出數(shù)據(jù)為正時,在數(shù)據(jù)之前顯示一個+號,為負時,在數(shù)據(jù)之前顯示一個-號。
#
輸出數(shù)據(jù)為八進制時加前綴0,為十六進制時前綴0x。
空格
輸出數(shù)據(jù)為正值時,在數(shù)據(jù)之前打印空格,為負時,數(shù)據(jù)之前顯示一個-號。
例4:標志修飾符的使用。
main()
{
printf("%10d\n",123);
printf("%-10d\n",123);
printf("%10.2f\n",123.45678);
printf("%-10.2f\n",123.45678);
printf("%10s\n","Cprogram");
printf("%-10s\n","Cprogram") ;
printf("\n");
printf("%+5d\n",12345);
printf("%+5d\n",-12345);
printf("% 5d\n",12345);
printf("% 5d\n",-12345);
printf("\n");
printf("%#o\n",100);
printf("%o\n",100);
printf("%#x\n",100);
printf("%x\n",100);
}
執(zhí)行程序,結果如下:
123
123
123.46
123.46
Cprogram
Cprogram
+12345
-12345
12345
-12345
0144
144
0x64
64
提示
數(shù)據(jù)輸出時,注意輸出格式基對齊方式的統(tǒng)一,否則造成輸出數(shù)據(jù)難以讀懂。
例如:
int x=123,y=456;
printf(“%3d%-3d”,x,y);
其結果是:123456
5)普通字符
格式控制字符串中可以包含大量的可打印字符和轉義字符,可打印字符主要是一些說明字符,這些字符將按原書寫樣式顯示在屏幕上,如果有漢字系統(tǒng)支持,也可以輸出漢字。轉義字符是不可打印字符,用以控制產生特殊的輸出效果。
例如:
int a=123,b=12345;
printf("a=%d,",a);
printf("b=%d\n",b);
其輸出結果為:a=123,b=12345
在第一個printf函數(shù)的格式控制字符串中,’a’、’=’和’,’都是普通字符,可以打印出來。第二個printf函數(shù)的格式控制字符串中的’b’和’=’也是可打印字符,但\n時是轉義字符,不能夠打印出來,表示要換行輸出。將該程序改動一下,其輸出形式也將發(fā)生改變。
int a=123,b=12345;
printf("a=%d\n",a);
printf("b=%d\n",b);
輸出形式為:
a=123
b=12345
在第一個printf函數(shù)的格式控制字符串中,a和=是普通字符,打印出來。’\n’雖然沒有打印出來,但是它指示第二個printf函數(shù)換到下一行左側輸出。
——摘自高克寧 雒興剛主編《高級語言程序設計》