c&c++輸入輸出控制格式
許多情況下,都需要控制輸出結果的表現形式。如輸出寬度、輸出精度、輸出格式等。C++的iomanip.h中定義了許多控制符,這些控制符可以直接插入到流中,控制數據的輸出格式。控制符有兩種:控制常量和控制函數,控制常量定義在iostream.h中,控制函數定義在iomanip.h中。
常用控制符在iostream.h中,函數控制符在iomainip.h中。
控制符 描述
dec 10進制
hex 16進制
oct 8進制
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進制數小寫輸出
注意:除了setw(n)控制符之外,其他控制符對后面的所有輸出起控制作用,直到改變輸出格式為止。
例1、輸出8進制和16進制數
常量dec、hex和oct用來控制必須按10進制、16進制或8進制形式輸出。
1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 int number=15; 6 cout<<dec<<number<<"\n"<<hex<< number<<"\n"<<oct<<number<<"\n"; 7 return 0; 8 }
結果為:
15
f
17
注意:由於這三個標識符已經被定義為系統常量,注意不能在定義為其他變量使用。
上面這段代碼沒有加#include<iomanip>也能正確運行,但是假如想下面這一段代碼使用了setw就要加這個類引用了。
例2、設置值的輸出寬度
函數setw(n)用來控制輸出寬度,如果數據實際寬度大於設置寬度,將按實際寬讀輸出;如果設置寬度大於實際輸出寬度,數據輸出時將在前面補相應數量的空格。另外,該控制符只對一次輸出起作用。
1 #include <iostream> 2 #include <iomanip> 3 using namespace std; 4 int main( ) 5 { 6 int number=1234; 7 cout<<setw(5)<<number<<setw(5)<<564<<endl; 8 return 0; 9 }
運行結果:
_1234_ _564
例3、設置填充字符
setfill(c)函數用來設置填充的字符,默認情況下為空格。
1 #include <iostream> 2 #include <iomanip> 3 using namespace std; 4 int main() 5 { 6 int number=1234; 7 cout <<setfill('*')<<setw(5)<<number<<endl; 8 return 0; 9 }
輸出結果:
*1234
例4、設置對齊格式
函數setiosflags(ios::left)和setiosflags(ios::right)用來控制輸出左右對齊格式。當數據實際寬度小於輸出寬度時該控制才起作用。默認情況下數據輸出是右對齊。
1 #include<iostream> 2 #include<iomanip> 3 using namespace std; 4 int main() 5 { 6 int number=1234; 7 cout<<setiosflags(ios::left)<<setfill('*')<<setw(6)<<number<<endl; 8 cout<<setiosflags(ios::right)<<setfill('*')<<setw(6)<<number<<endl; 9 return 0; 10 }
輸出結果:
1234**
**1234
例5、控制浮點數顯示
函數setprecision(n)可用來控制輸出流顯示浮點數的數字個數(整數部分加小數部分)。
c++默認的流輸出數值的有效位是6。當小數截短顯示時,進行四舍五入處理。
函數setiosflags(ios::fixed)用來控制符點數是按純小數方式顯示。系統默認為純小數方式輸出。
函數setiosflags(ios::scientific)用來控制符點數是按科學記數法方式顯示。
函數setiosflags(ios::showpoint) 用來強制顯示小數點和符號。
1 #include<iostream> 2 #include<iomanip> 3 using namespace std; 4 int main() 5 { 6 const float x=20.0/7,y=18.0/6; 7 8 cout<<"x:\n"; 9 cout<<x<<endl; 10 cout<<setiosflags(ios::scientific)<<x<<endl; 11 cout<<setiosflags(ios::fixed)<<x<<endl; 12 13 cout<<"\ny:\n"; 14 cout<<y<<endl; 15 cout<<setiosflags(ios::showpoint)<<y<<endl; 16 return 0; 17 }
輸出結果為:
2.85714 (默認6位,整數部分加小數部分)
2.857143e+000 (默認6位,指小數部分)
3 (默認0不輸出)
3.00000 (強制輸出0)
標准輸入輸出函數printf與scanf
在程序設計中輸入輸出是不可缺少的內容,因此在C語言中提供了printf與scanf標准函數來滿足輸入輸出要求。需要說明的是,在C++中提供了更方便的輸入輸出控制,這就是I/O流。但為了滿足一些對printf與scanf使用習慣的要求,C++中仍保留了這兩個函數。
<1>、printf函數
格式:
printf (格式控制字符串,輸出項1,輸出項2,…)
說明:
(1)格式控制字符串決定了數據輸出的結果。它由“格式說明字符”和“普通字符”組成。普通字符按原樣輸出,格式說明字符將對應輸出數據轉換成指定的格式輸出。格式控制字符串的形式為:
%[域寬]格式字符
域寬部分是可選的,每個格式說明對應於一個輸出參數,該參數被轉換成由格式說明規定的數據格式后輸出。
例如:
1 #include <iostream> 2 #include <iomanip> 3 using namespace std; 4 int main() 5 { 6 int a=10; 7 float b=-5.2; 8 printf("a=%d,b=%8.3f\n",a,b); 9 return 0; 10 }
輸出結果如下:
a=10,b= -5.200
(2)格式說明字符及其規定的輸出格式
printf的格式說明字符見下表
格式說明符 參數類型 輸出格式
d,I int 十進制整數
o int 八進制數(無前導0)
x,X int 十六進制數(無前綴0x或0X)
u int 無符號十進制數
c int 單個字符
s char * 字符串(必須以’\0’結束或給定長度)
f double 小數形式的的浮點數(小數位數由精度決定,缺省為6位)
e,E double 標准指數形式的浮點數(小數位數由精度決定,缺省為6位)
% 不轉換 輸出一個%
域寬說明字符 意義
- 在指定的區域內以左對齊方式輸出(無’-’號時為右對齊)
+ 輸出正值時前面冠以符號+
空格 輸出的第一個字符不是符號時,要輸出一個空格做前綴
0(零) 在域寬范圍內用前導0填補空位
# 對於o格式輸出前導0,對於x或X輸出0x或0X前綴。
m(正整數) 指出輸出數據的最小寬度。
.(小數點) 分隔域寬與精度,小數點前面可以沒有與寬說明
n(正整數) 數據輸出的精度即小數部分的位數,
h 指出輸出數據是短整型
l 指出輸出數據是長整型
L 指出輸出數據是高精度浮點型(long double)
例1
1 #include<stdio.h> 2 int main() 3 { 4 int a=10; 5 float b=-5.2; 6 printf("a=%#o,b=%08.3f",a,b); 7 return 0; 8 }
輸出結果為:
a=012,b=-008.200
例2
1 #include<stdio.h> 2 int main() 3 { 4 int a=28,b=38; 5 long c=289868; 6 printf("%5d,%5d\n%ld\n",a,b,c); 7 printf("%3ld\n%7ld\n%d\n",c,c,c); 8 return 0; 9 }
結果:
28, 38
289868
289868
289868
289868 //16位機輸出27724
例3
1 #include<stdio.h> 2 int main() 3 { 4 int a=-3; 5 printf("%d,%o,%x,%X,%6x\n",a,a,a,a,a); 6 return 0; 7 }
在16位機上輸出結果為:
-3,177775,fffd,FFFD,fffd
在32位機上輸出結果為:
-3,37777777775,fffffffd,FFFFFFFD,fffffffd
例4
1 #include<stdio.h> 2 int main() 3 { 4 char ch='a'; 5 int a=65; 6 printf("%c,%d,%3c\n",ch,ch,ch); 7 printf("%c,%d,%3d\n",a,a,a); 8 return 0; 9 }
輸出結果為:
a,97, a
A,65, 65
例5
1 #include<stdio.h> 2 int main() 3 { 4 printf("%3s,%-5.3s,%5.2s\n","hello","hello","hello"); 5 return 0; 6 }
輸出結果為:
hello,hel , he
說明:第一個"hello"按%3s輸出,由於"hello"長度超過3,因此按實際長度輸出。第二個"hello"輸出寬度為5,且從前面截取3個字符左對齊輸出,第三個"hello"的輸出寬度仍為5,從"hello"中截取2個字符右對齊輸出。
<2>scanf函數
一般形式:
scanf(格式控制字符串,地址1,地址2,…);
說明:格式控制字符串同前面的printf函數。地址是指變量的地址,格式是變量的前面加&符號。
例如:
1 #include<stdio.h> 2 int main() 3 { 4 int i; 5 printf("please input i:\n"); 6 scanf("%d",&i); 7 printf("i=%d\n",i); 8 return 0; 9 }
變量的定義與初始化
看下面例子:
1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 int num; 6 char ch='a'; 7 for (num=ch;num<='z';num++) 8 cout<<num<<","; 9 return 0; 10 }
程序輸出什么結果?
答:將輸出97,98,...,122
在c++中,任何一個變量在被引用之前必須被定義。
c++中變量可以在程序中隨時定義,不必集中在程序之前。
定義格式:
〈類型〉〈變量名表〉;
當有多個變量時,其間用逗號隔開。
例如:
int i,j,k; float x,y,z; char c1,c2,c3;
注意:在同一個內存塊中不允許定義同名變量,即不允許重復定義一個變量。
變量在定義時可直接給變量一個初始值,稱為變量初始化。變量初始化也可放在需要的時候進行。變量被初始化后其值將保存到被改變為止。變量定義以后,如果沒有被初始化,並不意味着這個變量中沒值,該變量中要么是默認值,要么是無效值。在后面將要講到,對外部和靜態變量定義后其默認值對int型的為0,對浮點型的為0.0;對char型為空。而其他內部變量未初始化時其值是無效的,這是因為該變量所在地址中的內容是先前保留下來的無意義的值。在定義變量時可一次初始化多個變量。
例如:
float x,y=3.14,z=0.0;
char ch1='a', ch2='\n';
這里,y,z,ch1,ch2在定義的同時就進行了初始化。
而x只是做了變量說明並沒有賦初值。