1. 程式人生 > >C/C++標準輸入輸出格式控制

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>
int main () { int a; char c; char str[100]; scanf("%d%c%s",&a,&c,str); //這裡c會接收一個回車字元 或者空格,根據輸入形式決定 scanf("%s",s); printf("%d %d %s\n",a,c,str); printf("%s",s); }

總之用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;
 }