C語言輸出格式總結ios
1 通常格式
printf(格式控制,輸出表列)
例如:printf("i=%d,ch=%c\n",i,ch);
說明:
(1)「格式控制」是用雙撇號括起來的字符串,也稱「轉換控制字符串」,它包括兩種信息:
①格式說明:由「%」和格式字符組成,它的做用是將輸出的數據轉換爲指定的格式輸出。
②普通字符,即須要原樣輸出的字符。
(2)「輸出表列」是須要輸出的一些數據,能夠是表達式
(3) printf函數的通常形式能夠表示爲
printf(參數1,參數2,……,參數n)
功能是將參數2~參數n按參數1給定的格式輸出
2 格式字符(9種)
(1)d(或i)格式符。用來輸出十進制整數,有如下幾種用法:
①%d,按整型數據的實際長度輸出。
②%md,m爲指定的輸出字段的寬度。若是數據的位數小於m,則左端補以空格,若大於m,則按實際位數輸出。
③%ld(%mld 也可),輸出長整型數據。
例如:long a=123456;
printf("%ld",a);
(2)o格式符,以八進制數形式輸出整數。格式:%o,%mo,%lo,%mlo均可。
(3)x(或X)格式符,以十六進制數形式輸出整數。格式:%x,%mx,%lx,%mlx均可。
(4)u格式符,用來輸出unsigned型數據,即無符號數,以十進制數形式輸出。格式:%u,%mu,%lu均可。
參見:li4-3.c
(5)c格式符,用來輸出一個字符。格式:%c,%mc均可。
(6)s格式符,用來輸出一個字符串。格式:%s,%ms,%-ms,%m.ns,%-m.ns均可。
(7)f格式符,用來輸出實數(包括單、雙精度),以小數形式輸出。格式:%f,%m.nf,%-m.nf均可。
注意:單精度實數的有效位數通常爲7位,雙精度爲16位。
(8)e(或E)格式符,以指數形式輸出實數。格式:%e,%m.ne,%-m.ne均可。
(9)g(或G)格式符,用來輸出實數,它根據數值的大小,自動選f格式或e格式(選擇輸出時佔寬度較小的一種)。
3 說明
(1)除了X、E、G(用大寫字母表示)外,其餘格式字符必須用小寫字母;
(2)「格式控制」字符串內能夠包含轉義字符;
(3)若是想輸出字符「%」,則應該在「格式控制」字符串中用連續兩個%表示,如:
printf("%f%%",1.0/3);
(4)格式字符表參見下表
表1 printf格式字符
表2 printf的附加格式說明字符
|
C語言輸出格式總結 2008年11月01日 星期六 04:23 P.M. 1 通常格式 printf(格式控制,輸出表列) 例如:printf("i=%d,ch=%c\n",i,ch); 說明: (1)「格式控制」是用雙撇號括起來的字符串,也稱「轉換控制字符串」,它包括兩種信息: ①格式說明:由「%」和格式字符組成,它的做用是將輸出的數據轉換爲指定的格式輸出。 ②普通字符,即須要原樣輸出的字符。 (2)「輸出表列」是須要輸出的一些數據,能夠是表達式 (3) printf函數的通常形式能夠表示爲 printf(參數1,參數2,……,參數n) 功能是將參數2~參數n按參數1給定的格式輸出 2 格式字符(9種) (1)d(或i)格式符。用來輸出十進制整數,有如下幾種用法: ①%d,按整型數據的實際長度輸出。 ②%md,m爲指定的輸出字段的寬度。若是數據的位數小於m,則左端補以空格,若大於m,則按實際位數輸出。 ③%ld(%mld 也可),輸出長整型數據。 例如:long a=123456; printf("%ld",a); (2)o格式符,以八進制數形式輸出整數。格式:%o,%mo,%lo,%mlo均可。 (3)x(或X)格式符,以十六進制數形式輸出整數。格式:%x,%mx,%lx,%mlx均可。 (4)u格式符,用來輸出unsigned型數據,即無符號數,以十進制數形式輸出。格式:%u,%mu,%lu均可。 參見:li4-3.c (5)c格式符,用來輸出一個字符。格式:%c,%mc均可。 (6)s格式符,用來輸出一個字符串。格式:%s,%ms,%-ms,%m.ns,%-m.ns均可。 (7)f格式符,用來輸出實數(包括單、雙精度),以小數形式輸出。格式:%f,%m.nf,%-m.nf均可。 注意:單精度實數的有效位數通常爲7位,雙精度爲16位。 (8)e(或E)格式符,以指數形式輸出實數。格式:%e,%m.ne,%-m.ne均可。 (9)g(或G)格式符,用來輸出實數,它根據數值的大小,自動選f格式或e格式(選擇輸出時佔寬度較小的一種)。 3 說明 (1)除了X、E、G(用大寫字母表示)外,其餘格式字符必須用小寫字母; (2)「格式控制」字符串內能夠包含轉義字符; (3)若是想輸出字符「%」,則應該在「格式控制」字符串中用連續兩個%表示,如: printf("%f%%",1.0/3); (4)格式字符表參見下表 表1 printf格式字符 格式字符 說 明 d,i 以帶符號的十進制形式輸出整數(正數不輸出符號) o 以八進制無符號形式輸出整數(不輸出前導符0) x,X 以十六進制無符號形式輸出整數(不輸出前導符0x),用x則輸出十六進制數的a~f時以小寫形式輸出,用X時,則以大寫字母輸出 u 以無符號十進制形式輸出整數 c 以字符形式輸出,只輸出一個字符 s 輸出字符串 f 以小數形式輸出單、雙精度數,隱含輸出6位小數 e,E 以指數形式輸出實數 g,G 選用%f或%e格式中輸出寬度較短的一種格式,不輸出無心義的0 表2 printf的附加格式說明字符 C語言輸出格式總結
C++c++
setprecision(n)可控制輸出流顯示浮點數的數字個數。C++默認的流輸出數值有效位是6,因此無論數據是多少,都只輸出六位。若是setprecision(n)與setiosflags(ios::fixed)或者setiosflags(ios_base::fixed)合用,能夠控制小數點右邊的數字個數。setiosflags(ios::fixed)是用定點方式表示實數。 若是與setiosnags(ios::scientific)合用,能夠控制指數表示法的小數位數。setiosflags(ios::scientific)是用指數方式表示實數。ide
I/O流經常使用控制符:函數
使用控制符時,在程序開頭加投文件#include <iomanip> C++有兩種方法控制格式輸出:一、用格式控制符;二、用流對象的成員函數 格式控制符:post
dec 設置基數爲10url
hex 設置基數爲16spa
oct 設置基數爲83d
setfill(c) 設置填充字符ccode
setprecision(n) 設置顯示小數精度爲n位
setw(n) 設置域寬爲n個字符
setiosflags(ios::fixed) 固定的浮點顯示
setiosflags(ios::scientific) 指數表示
setiosflags(ios::left) 左對齊
setiosflags(ios::right) 右對齊
setiosflags(ios::skipws) 忽略前導空白
setiosflags(ios::uppercase) 16進制數大寫輸出
setiosflags(ios::lowercase) 16進制小寫輸出
成員函數:
flags(10) 設置基數爲10
flags(16) 設置基數爲16
flags(8) 設置基數爲8
flags(c) 設置填充字符c
precision(n) 設置顯示小數精度爲n位
width(n) 設置域寬爲n個字符
在新版本的c++中頭文件已經用iomanip取代了iomanip.h。
如下是一些經常使用的函數:
dec 置基數爲10 至關於"%d"
hex 置基數爲16 至關於"%X"
oct 置基數爲8 至關於"%o"
setfill(c) 設填充字符爲c
setprecision(n) 設顯示小數精度爲n位
setw(n) 設域寬爲n個字符
setiosflags(ios::fixed) 固定的浮點顯示
setiosflags(ios::scientific) 指數表示
setiosflags(ios::left) 左對齊
setiosflags(ios::right) 右對齊
setiosflags(ios::skipws 忽略前導空白
setiosflags(ios::uppercase) 16進制數大寫輸出
setiosflags(ios::lowercase) 16進制小寫輸出
setiosflags(ios::showpoint) 強制顯示小數點
setiosflags(ios::showpos) 強制顯示符號
1 #include <iostream> 2 #include <iomanip> 3 using namespace std; 4 int main () 5 { 6 double a=123456.343001; 7 cout<<"a的值爲123456.343001"<<endl<<endl; 8 cout<<"不作任何操做,默認狀況下只顯示6六位數據:"<<a<<endl<<endl; 9 cout<<"指定10位小數且爲浮點數表示setiosflags(ios::fixed):"<<setiosflags(ios::fixed)<<setprecision(10)<<a<<endl<<endl; 10 cout<<"指定爲10位小數且爲指數形式表示setiosflags(ios::scientific),就是留下有效位:如何指定的有效位超過原本的有效位,其輸出就是自己的位數:"<<setiosflags(ios::scientific)<<setprecision(12)<<a<<endl<<endl; 11 cout<<"指定爲10位小數且爲指數形式表示setiosflags(ios::scientific),就是留下有效位:setprecision(10)指定留下10位有效位"<<setiosflags(ios::scientific)<<setprecision(10)<<a<<endl<<endl; 12 cout<<"左對齊:"<<setiosflags(ios::left)<<setprecision(20)<<a<<endl<<endl; 13 cout<<"右對齊:"<<setiosflags(ios::right)<<setprecision(20)<<a<<endl<<endl; 14 system("pause"); 15 return 0; 16 }
能夠不使用#include<iomanip>的
cout.precision()設置小數點後精確度,
cout.width()設置寬度,
cout.setf()設置顯示格式,好比
cout.setf(ios::left)左對齊
cout.setf(ios::showpoint)不論是否有小數位,顯示小數點
cout.fill();不足寬度則填充,如cout.fill('0');
如此次周賽1002,若是使用COUT在輸出前要這樣設置一下。
cout.precision(6);
cout.width(8);
cout.setf(ios::left);
cout.setf(ios::showpoint);
cout.fill('0');
僅僅cout.precision(6)和cout.setf(ios::showpoint)時,不知何緣由若是爲0只顯示到小
數點後5位,因此爲了在最後加個0,要加上其它3項補充(部分是iomanip裏的):
long flags( ) const 返回當前的格式標誌。
long flays(long newflag) 設置格式標誌爲newflag,返回舊的格式標誌。
long setf(long bits) 設置指定的格式標誌位,返回舊的格式標誌。
long setf(long bits,long field)將field指定的格式標誌位置爲bits,返回舊的格式標誌
long unsetf(long bits) 清除bits指定的格式標誌位,返回舊的格式標誌。
long fill(char c) 設置填充字符,缺省條件下是空格。
char fill( ) 返回當前填充字符。
int precision(int val) 設置精確度爲val,控制輸出浮點數的有效位,返回舊值。
int precision( ) 返回舊的精確度值。
int width(int val) 設置顯示數據的寬度(域寬),返回舊的域寬。
int width( )只返回當前域寬,缺省寬度爲0。這時插入操做能按表示數據的最小寬度顯示
數據
dec 十進制的輸入輸出
hex 十六進制的輸入輸出
oct 八進制的輸入輸出
例如用cout<<hex<<i<<endl; 便可以讓變量i以16進制的格式輸出。
ws 提取空白字符
flush 刷新流
resetiosflags(long) 請除特定的格式標誌位
setiosflags(long) 設置特定的格式標誌位
setfill(char) 設置填充字符
setprecision(int) 設置輸出浮點數的精確度
setw(int) 設置域寬格式變量
一:標準輸入函數cin 不知道說它是個函數對仍是不對,它是表明標準的輸入設備--鍵盤。他是屬於流的,他的用法和流的用法是同樣的。也就是:cin>>變量;
小小的說明一下,輸入多個變量能夠寫在一行,如:cin>>x>>y>>z; 這樣寫不是不容許,而是很差看,若是是不一樣的變量類型,那就更是沒頭沒腦了。除了你,人家是不知道該輸入什麼的
,因此,通常在輸入語句的前面,咱們通常都 要作一個提示,請輸入×××,讓人家內心有個底,知道這個變量是作什麼的。 另外,這個函數是不用帶地址符號"&"的,也不用寫明變量類型,千萬不要跟scanf混淆。固然他就也不檢查變量輸入是否合法。如:
int i; cout<<"please input a number:" cin>>i; cout<<"i="<<i<<endl;
若是你輸入的是一個字符如'a'那麼他也不檢查,但你輸出的結果不是正確的,這要是手工進行檢查。固然他也跟scanf同樣,若是在循環內部輸入不合法的變量值,那麼也將陷入死循環。以下:
1 /*一個輸入不合法變量陷入死循環的例子*/ #include <iostream.h> main() { int i; while(i!=-1) { cout<<"i=" cin>>i; /*請輸入不是一個字符如'a'試試*/ cout<<endl; } }
如上一個程序,若是你輸入的不合法,那就將陷入死循環。解決的辦法有個一,把cin>>i;語句移到判斷循環的語句中,那麼,你輸入的若是是不合法的變量,他將跳出循環。 cin是用空格來分隔輸入的。請看看以下的例子:
/*一個空格分隔使輸入的變量達不到但願的值*/ #include <iostream.h> main() { char str[20]; cout<<"please input a string:"; cin>>str; /*你試着輸入"hello word"*/ cout<<endl<<"str="<<str; }
看獲得是什麼結果呢?獲得的僅僅是str=hello,爲何呢?由於cin是以空格爲分隔的,當你輸入一個空格時,那他就認爲後面的輸入不屬於這裏了, 認爲應該給後面的變量了。另外,當你輸入的字符串大於分配的空間時,還會出現溢出現象。固然,還有整行輸入的函數,包括空格也一塊兒輸入了,之後也會學到。
2、標準輸出函數cout 說cout是函數,也跟cin同樣,不知道對不對。他表明的是標準輸出設備--顯示器。其實前面已經用過不少次這個函數了。咱們就經過一個例子來進行格式化的輸出就是了,你們就體會體會這個例子就好了,比printf靈活了不少。 首先,咱們能夠按16進制,8進制和10進制來顯示咱們的數據,以下:
1 /*一個按進制輸出的例子*/ 2 #include<iomanip.h> 3 void main() 4 { 5 int x=30, y=300, z=1024; 6 cout<<x<<' '<<y<<' '<<z<<endl; //按十進制輸出 7 cout<<oct<<x<<' '<<y<<' '<<z<<endl; //按八進制輸出 8 cout<<setiosflags(ios::showbase); //設置基指示符 9 cout<<x<<' '<<y<<' '<<z<<endl; //仍按八進制輸出 10 cout<<resetiosflags(ios::showbase); //取消基指示符 11 cout<<hex<<x<<' '<<y<<' '<<z<<endl; //按十六進制輸出 12 cout<<setiosflags(ios::showbase | ios::uppercase); 13 //設置基指示符和數值中的字母大寫輸出, 14 cout<<x<<' '<<y<<' '<<z<<endl; //仍按十六進制輸出 15 cout<<resetiosflags(ios::showbase | ios::uppercase); 16 //取消基指示符和數值中的字母大寫輸出 17 cout<<x<<' '<<y<<' '<<z<<endl; //仍按十六進制輸出 18 cout<<dec<<x<<' '<<y<<' '<<z<<endl; //按十進制輸出 19 }
咱們用以上的程序也能夠輸出一樣的結果,可見他的靈活。咱們如今輸出下列一段文字:
第一章
1.1 什麼是C語言...........................1
1.11 C語言的歷史..........................58
第二章
方法不少種啦,咱們能夠這樣寫:
1 /*一個使用填充,寬度,對齊方式的例子*/ 2 #include <iostream.h> 3 void main() 4 { 5 cout<<"第一章"<<endl; 6 cout<<" "; 7 cout.setf(ios::left); //設置對齊方式爲left 8 cout.width(7); //設置寬度爲7,不足用空格填充 9 cout<<"1.1"; 10 cout<<"什麼是C語言"; 11 cout.unsetf(ios::left); //取消對齊方式,用缺省right方式 12 cout.fill('.'); //設置填充方式 13 cout.width(30); //設置寬度,只對下條輸出有用 14 cout<<1<<endl; 15 cout<<" "; 16 cout.width(7); //設置寬度 17 cout.setf(ios::left); //設置對齊方式爲left 18 cout.fill(' '); //設置填充,缺省爲空格 19 cout<<"1.11"; 20 cout<<"C語言的歷史"; 21 cout.unsetf(ios::left); //取消對齊方式 22 cout.fill('.'); 23 cout.width(30); 24 cout<<58<<endl; 25 cout.fill(' '); 26 cout<<"第二章"<<endl; 27 }
咱們屢次設置了寬度,爲的是使咱們的間距能一致,也使用了對齊方式,爲的是使咱們的數據能對齊顯示,看起來美觀
。咱們還使用了填充方式。咱們下面用操縱算子來實現也是能夠的。
1 /*一個使用填充,寬度,對齊方式的例子*/ 2 #include <iomanip.h> 3 void main() 4 { 5 cout<<"第一章"<<endl; 6 cout<<" "; 7 cout<<setiosflags(ios::left)<<setw(7); //設置寬度爲7,left對齊方式 8 cout<<"1.1"; 9 cout<<"什麼是C語言"; 10 cout<<resetiosflags(ios::left); //取消對齊方式 11 cout<<setfill('.')<<setw(30)<<1<<endl; //寬度爲30,填充爲'.'輸出 12 cout<<setfill(' '); //恢復填充爲空格 13 cout<<" "; 14 cout<<setw(7)<<setiosflags(ios::left); //設置寬度爲7,left對齊方式 15 cout<<"1.11"; 16 cout<<"C語言的歷史"; 17 cout<<resetiosflags(ios::left); //取消對齊方式 18 cout<<setfill('.')<<setw(30)<<58<<endl; //寬度爲30,填充爲'.'輸出 19 cout<<setfill(' ')<<"第二章"<<endl; 20 }
咱們輸出了一樣的效果,不過依個人性格,我更喜歡用操縱算子來進行格式化輸出。最後咱們看看浮點數的格式輸出,
以下例:
1 /*關於浮點數的格式*/ 2 #include <iostream.h> 3 void main() 4 { 5 float f=2.0/3.0,f1=0.000000001,f2=-9.9; 6 cout<<f<<' '<<f1<<' '<<f2<<endl; //正常輸出 7 cout.setf(ios::showpos); //強制在正數前加+號 8 cout<<f<<' '<<f1<<' '<<f2<<endl; 9 cout.unsetf(ios::showpos); //取消正數前加+號 10 cout.setf(ios::showpoint); //強制顯示小數點後的無效0 11 cout<<f<<' '<<f1<<' '<<f2<<endl; 12 cout.unsetf(ios::showpoint); //取消顯示小數點後的無效0 13 cout.setf(ios::scientific); //科學記數法 14 cout<<f<<' '<<f1<<' '<<f2<<endl; 15 cout.unsetf(ios::scientific); //取消科學記數法 16 cout.setf(ios::fixed); //按點輸出顯示 17 cout<<f<<' '<<f1<<' '<<f2<<endl; 18 cout.unsetf(ios::fixed); //取消按點輸出顯示 19 cout.precision(18); //精度爲18,正常爲6 20 cout<<f<<' '<<f1<<' '<<f2<<endl; 21 cout.precision(6); //精度恢復爲6 22 }
一樣,咱們也同樣能用操縱算子實現一樣的功能:
1 /*關於浮點數的格式*/ 2 #include <iomanip.h> 3 void main() 4 { 5 float f=2.0/3.0,f1=0.000000001,f2=-9.9; 6 cout<<f<<' '<<f1<<' '<<f2<<endl; //正常輸出 7 cout<<setiosflags(ios::showpos); //強制在正數前加+號 8 cout<<f<<' '<<f1<<' '<<f2<<endl; 9 cout<<resetiosflags(ios::showpos); //取消正數前加+號 10 cout<<setiosflags(ios::showpoint); //強制顯示小數點後的無效0 11 cout<<f<<' '<<f1<<' '<<f2<<endl; 12 cout<<resetiosflags(ios::showpoint); //取消顯示小數點後的無效0 13 cout<<setiosflags(ios::scientific); //科學記數法 14 cout<<f<<' '<<f1<<' '<<f2<<endl; 15 cout<<resetiosflags(ios::scientific); //取消科學記數法 16 cout<<setiosflags(ios::fixed); //按點輸出顯示 17 cout<<f<<' '<<f1<<' '<<f2<<endl; 18 cout<<resetiosflags(ios::fixed); //取消按點輸出顯示 19 cout<<setprecision(18); //精度爲18,正常爲6 20 cout<<f<<' '<<f1<<' '<<f2<<endl; 21 cout<<setprecision(6); //精度恢復爲6 22 }
在c/c++系統中除了標準的輸入輸出外,還提供了更多的輸入函數。
這寫函數主要有getch(),getche(), getchar (),cin.get(),putch(),putchar(),cout.put(),gets(),cin.getline(),puts()。
另外 還有些爲了讓緩衝區不影響程序的正確操做的緩衝去的操做,如:cin.putback(),fflush(stdin),cout.flush().咱們 作一下簡單的說明。
一、getch()和getche(),非緩衝式輸入,從鍵盤讀入一個字符。getch()讀入字符不顯示。有conio.h支持。
二、cin.get(),getchar(),緩衝式輸入,從鍵盤讀入一個字符,並顯示。getchar()由stdio.h支持,cin.get()由iostream.h支持。
三、putch()和putchar(),非緩衝式輸出,輸出一個字符到顯示器。putch()由conio.h支持,putchar()由stdio.h支持。
四、cout.put(),緩衝式輸出,輸出一個字符到顯示器。由iostream.h支持。
五、gets()和cin.geline(),緩衝式輸入,讀入一字符串(包括空格,不包括最後的回車),gets()由stdio.h支持,cin.getline()由iostream.h支持。
六、puts(),非緩衝輸出,輸出一個字符串,由stdio.h支持。
七、cin.putback(),把一個字符送回輸入緩衝區。
八、fflush(stdin),清除輸入緩衝區操做。沒法清除cin.get()等帶來的操做。
九、cout.flush(),清楚輸出緩衝區。 在這裏咱們稍微說一下輸入/輸出緩衝區,這是爲了減小程序訪問io帶來中斷而設的一段空間。當程序知足某個刷新條件時,那就將清理緩衝區。具體條件爲:
一、輸入緩衝區 a,程序要求輸入時,按下了回車鍵。 b,遇到程序結束。 c,遇到下一條輸入語句。 d,遇到清除緩衝區操做 e,緩衝區溢出 二、輸出緩衝區 a,輸出緩衝區溢出 b,遇到下一條輸入語句 c,使用刷新緩衝區迫使清除
例2 用控制符控制輸出格式
1 #include <iostream> 2 #include <iomanip> //不要忘記包含此頭文件 3 using namespace std; 4 int main() 5 { int a; 6 cout<<"input a:"; 7 cin>>a; 8 cout<<"dec:"<<dec<<a<<endl; //以上進制形式輸出整數 9 cout<<"hex:"<<hex<<a<<endl; //以十六進制形式輸出整數a 10 cout<<"oct:"<<setbase(8)<<a<<endl;//以八進制形式輸出整數a 11 char *pt="China"; //pt指向字符串」China」 12 cout<<setw(10)<<pt<<endl; //指定域寬爲10,輸出字符串 13 cout<<setfill('*')<<setw(10)<<pt<<endl;//指定域寬10,輸出字符串,空白處以「*」填充 14 double pi=22.0/7.0; //計算pi值 15 cout<<setiosflags(ios::scientific)<<setprecision(8);//按指數形式輸出,8位小數 16 cout<<"pi="<<pi<<endl; //輸出pi值 17 cout<<"pi="<<setprecision(4)<<pi<<endl;//改成4位小數 18 cout<<"pi="<<setiosflags(ios::fixed)<<pi<<endl;//改成小數形式輸出 19 return 0; }
運行結果以下:
inputa:34 (輸入a的值)
dec:34 (十進制形式)
hex:22 (十六進制形)
oct:42 (八進制形式)
China (域寬爲10)
***** China (域寬爲10,空白處以'*'填充)
pi=3.14285714e+00 (指數形式輸出,8位小數)
pi=3.1429e+00) (指數形式輸小,4位小數)
pi=3.143 (小數形式輸出,梢度仍爲4)