C/C++標準輸入輸出格式控制
- 1、c語言輸入輸出格式控制
-
(1)輸入格式控制–scanf()
語法:#include <stdio.h> int scanf( const char *format, ... );
scanf()函式根據由format(格式)指定的格式從stdin(標準輸入)讀取,並儲存資料到其它引數. 它和printf()有點類似. format(格式)字串由控制字元,空白字元和非空白字元組成. 控制字元以一個%符號開始,如下:
控制字元 說明 %c 一個單一的字元 %d 一個十進位制整數 %i 一個整數 %e, %f, %g 一個浮點數 %o 一個八進位制數 %s 一個字串 %x 一個十六進位制數 %p 一個指標 %n 一個等於讀取字元數量的整數 %u 一個無符號整數 %[] 一個字符集 %% 一個精度符號 scanf()讀取匹配format(格式)字串的輸入. 當讀取到一個控制字元, 它把值放置到下一個變數. 空白(tabs, 空格等等)會跳過. 非空白字元和輸入匹配, 然後丟棄. 如果是一個在%符號和控制符間的數量, 那麼只有指定數量的字元轉換到變數中. 如果scanf()遇到一個字符集(用%[]控制字元表示), 那麼在括號中的任意字元都會讀取到變數中. scanf()的返回值是成功賦值的變數數量, 發生錯誤時返回EOF.
一些簡單的測試資料:#include<stdio.h> int main () { int a; char c; char str[100]; scanf("%d",&a); //輸入整數a printf("%d\n",a); //輸出整數a //清空快取區,主要清除換行的影響,防止下一個輸入會接收換行符 fflush(stdin); scanf("%c",&c); //輸入字元c printf("%c\n",c); //輸出字元c fflush(stdin); scanf("%s",str); //輸入字串str printf("%s",str); }
#include<stdio.h>
總之用scanf()接收字元問題很多…
這裡有一個詳細介紹scanf函式及其常見問題的部落格,參考一下。
(2)輸出格式控制–printf()
語法:#include <stdio.h> int printf( const char *format, ... );
printf()函式根據format(格式)給出的格式列印輸出到STDOUT(標準輸出)和其它引數中.
字串format(格式)由兩類專案組成 - 顯示到螢幕上的字元和定義printf()顯示的其它引數. 基本上, 你可以指定一個包含文字在內的format(格式)字串,也可以是對映到printf()其它引數的”特殊”字元. 例如本程式碼
char name[20] = "Bob"; int age = 21; printf( "Hello %s, you are %d years old\n", name, age );
Code 格式 %c 字元 %d 帶符號整數 %i 帶符號整數 %e 科學計數法, 使用小寫”e” %E 科學計數法, 使用大寫”E” %f 浮點數 %g 使用%e或%f中較短的一個 %G 使用%E或%f中較短的一個 %o 八進位制 %s 一串字元 %u 無符號整數 %x 無符號十六進位制數, 用小寫字母 %X 無符號十六進位制數, 用大寫字母 %p 一個指標 %n 引數應該是一個指向一個整數的指標指向的是字元數放置的位置 %% 一個’%’符號 對於浮點數精度控制也相比c++更為方便
#include<stdio.h> using namespace std; int main () { double a=3.141592654; printf("%.4f",a); //輸出小數點後4位 return 0; } /* 結果: 3.1416 */
這個printf相比,若cout輸出比較大的double數,會用科學計數法顯示。
#include<iostream> using namespace std; int main () { double x=48787844545.265989; cout<<x; return 0; } /* 結果: 4.87878e+010 */
- 2、c++輸入輸出格式控制
-
(1)輸入格式控制–cin
#include<iostream> using namespace std; int main () { int a; char c; char str[100]; cin>>a>>c>>str; cout<<a<<endl<<c<<endl<<str<<endl; return 0; } /* 輸入: 1212 a good 輸出: 1212 a good */
從輸入輸出結果來看,cin輸入資料會自動忽略掉所有的空格、換行和回車,而自動匹配相應的字元和數字。這一點要比sprintf要簡單和實用很多。
(2)輸出格式控制–cout
一般情況下的輸出:#include<iostream> using namespace std; int main () { int a=666; char c='A'; string str="good day!"; cout<<a<<endl<<c<<endl<<str<<endl; return 0; }
寫了這麼多東西,終於寫到真正想寫的東西了!!!!接下來才是重點!!!!
控制浮點數的輸出格式:#include<iostream> #include<iomanip> //使用setiosflags所用標頭檔案 using namespace std; int main() { int a=15; double x=456789.123456789; double y=3456789.123456; double z=123.45678; //c++流的預設有效位數是六位 cout<<"x=456789.123456789 \t輸出-> \tx="<<x<<endl; cout<<"y=3456789.123456 \t輸出-> \ty="<<y<<endl; cout<<"z=123.45678 \t\t輸出-> \tz="<<z<<endl; //整數位超過六位用科學計數法表示,整數位+小數位超過六位,其餘小數採用四捨五入法捨去 cout<<endl<<"原值:x=456789.123456789"<<endl; cout<<setiosflags(ios::fixed); //設定一次,往下均可使用 cout<<"setiosflags(ios::fixed):"<<endl; cout<<"x=\t"<<x<<endl; //輸出精度為小數點後1位 cout<<"setprecision(1):"<<endl; cout<<setprecision(1)<<"\tx="<<x<<endl<<endl; //小數點後2位 cout<<"setprecision(2):"<<endl; cout<<setprecision(2)<<"\tx="<<x<<endl; cout<<"\tx="<<x<<endl<<endl; //3位 cout<<"setprecision(3):"<<endl; cout<<setprecision(3); cout<<"\tx="<<x<<endl; cout<<"\tx="<<x<<endl<<endl; //4位 cout<<"setprecision(4):"<<endl; cout<<setprecision(4); cout<<"\tx="<<x<<endl; return 0; }
解釋一下:
setiosflags()是包含在名稱空間iomanip中的C++操作符,該操作符的作用是執行由有引數指定區域內的動作;
iso::fixed 是操作符setiosflags的引數之一,該引數指定的動作是以帶小數點的形式表示浮點數,並且在允許的精度範圍內儘可能的把數字移向小數點右側;c++最大精度可以表示到小數點後六位。
設定setiosflags(ios::fixed)後,在接下來的輸出語句中不需要再次設定,預設按照該格式輸出
setprecision 也是包含在名稱空間iomanip中的C++操作符,該操作符的作用是設定浮點數;
setprecision(2),就是輸出小數點後2位,前提是已經設定setiosflags(ios::fixed)。如果未設定,則setprecision(n)就是設定輸出的有效位數。
由於c++預設的輸出流有效位為六位,所以當一些數需要保持特定的輸出時,上述操作符就變得相當有用。—-重點結束分割線—–
setiosflags()還有一些其他的引數,不再詳細解釋,附上引數表和一些自己的測試程式碼。
操作符 說明 dec 基數為10,相當於”%d” hex 基數為16,相當於”%X” oct 基數為8,相當於”%o” setfill(c) 填充字元為c setprecision(n) 設顯示小數精度為n位 setw(n) 設定域寬為n個字元 setioflags(ios::fixed) 固定的浮點顯示 setioflags(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) 強制顯示符號 輸出整數的十六進位制表示
#include<iostream> #include<iomanip> using namespace std; int main() { cout<<hex<<10<<endl; cout <<setiosflags (ios::showbase | ios::uppercase); cout<<10<<endl; return 0; }
setfill(c)和setw(n)
#include<iostream> #include<iomanip> using namespace std; int main() { cout<<'a'<<setw(10)<<'z'<<endl; //a-z之間9個空格 cout<<setfill('*')<<setw(10)<<"x"<<endl; return 0; }
a與z之間有9個空格,setw()只對其後面緊跟的輸出產生作用,如上例中,表示’z’共佔89個位置,不足的用空格填充。若輸入的內容超過setw()設定的長度,則按實際長度輸出。
setw()預設填充的內容為空格,可以setfill()配合使用設定其他字元填充。setioflags(ios::scientific)
#include<iostream> #include<iomanip> using namespace std; int main() { double x=123; cout<<x<<endl; cout<<setiosflags(ios::scientific)<<x<<endl; return 0; }
setiosflags(ios::showpoint)
#include<iostream> #include<iomanip> using namespace std; int main() { float x=1234; float y=-255; cout<<setiosflags(ios::showpoint); cout<<x<<endl<<y<<endl; return 0; }
setiosflags(ios::showpos)
#include<iostream> #include<iomanip> using namespace std; int main() { int x=1234; int y=-255; cout<<setiosflags(ios::showpos); cout<<x<<endl<<y<<endl; return 0; }