CString中Format函數與格式輸入與輸出


CString中Format函數與格式輸入與輸出

Format是一個非經常常使用。卻又似乎非常煩的方法,下面是它的完整概貌。以供大家查詢之用:  

格式化字符串forma("%d",12)意思是將一個整形的格式化的字符(我覺得是保持其形狀不變
1).
格式說明總是以%字符開始,下面是不同類型數據的格式方式%號后的說明
d
輸出帶符號十進制數 
o
輸出無符號八進制數 
x
輸出無符號十六進制數 
u
輸出無符號數 
c
輸出單個字符 
s
輸出一串字符 
f
輸出實數(6位小數) 
e
以指數形式輸出實數 
g
選用fe格式中輸出寬度較小的格式,不輸出
ld
輸入輸出long型數據 
lf
輸入輸出double型數據 
m
數據輸出寬度為
.n
輸出小數位數為


一、字符串 

首先看它的聲明:  
function Format(const Format: string; const Args: array of const): string; overload;  
其實Format方法有兩個種形式。第二種是三個參數的,主要差別在於它是線程安全的,  
但並不多用,所以這里僅僅對第一個介紹:  

function Format(const Format: string; const Args: array of const): string; overload;  
Format
參數是一個格式字符串,用於格式化Args里面的值的。

Args又是什么呢。  
它是一個變體數組。即它里面能夠有多個參數,並且每一個參數能夠不同。  
例如以下面樣例:  
Format("my name is %6s","wind");  
返回后就是  
my name is wind  

如今來看Format參數的具體情況:  
Format
里面能夠寫普通的字符串,比方"my name is"  
但有些格式指令字符具有特殊意義,比方"%6s"  

格式指令具有下面的形式:  
"%" [index ":"] ["-"] [width] ["." prec] type  
它是以"%"開始,而以type結束,type表示一個詳細的類型。中間是用來  
格式化type類型的指令字符,是可選的。

  

先來看看type,type能夠是下面字符:  
十制數,表示一個整型值  
d一樣是整型值,但它是無符號的,而假設它相應的值是負的。則返回時  
是一個232次方減去這個絕對值的數  
如:Format("this is %u",-2);  
返回的是:this is 4294967294  
相應浮點數  
科學表示法。相應整型數和浮點數,  
比方Format("this is %e",-2.22);  
返回的是:this is -2.220000E+000  
等一下再說明假設將數的精度縮小  
這個僅僅能相應浮點型,且它會將值中多余的數去掉  
比方Format("this is %g",02.200);  
返回的是:this is 2.2  
僅僅能相應浮點型,將值轉化為號碼的形式。看一個樣例就明確了  
Format("this is %n",4552.2176);  
返回的是this is 4,552.22  
注意有兩點。一是僅僅表示到小數后兩位。等一下說怎么消除這樣的情況  
二是。即使小數沒有被截斷。它也不會也像整數部分一樣有逗號來分開的  
錢幣類型,但關於貨幣類型有更好的格式化方法,這里僅僅是簡單的格式化  
另外它僅僅相應於浮點值  
Format("this is %m",9552.21);  
返回:this is 9,552.21  
相應於指針類型,返回的值是指針的地址,以十六進制的形式來表示  
比如:  
Format("this is %p",p);  
Edit1
的內容是:this is 0012F548  
相應字符串類型,不用多說了吧  
必須是一個整形值,以十六進制的形式返回  
Format("this is %X",15);  
返回是:this is F  

類型講述完成,以下介紹格式化Type的指令:  
[index ":"] 
這個要怎么表達呢,看一個樣例  
Format("this is %d %d",12,13);  
當中第一個%d的索引是0,第二個%d1,所以字符顯示的時候  
是這樣 this is 12 13  

而假設你這樣定義:  
Format("this is %1:d %0:d",12,13);  
那么返回的字符串就變成了  
this is 13 12  
如今明確了嗎,[index ":"] 中的index指示Args中參數顯示的  
順序  

另一種情況,假設這樣Format("%d %d %d %0:d %d", 1, 2, 3, 4) ; 
將返回1 2 3 1 2  
假設你想返回的是1 2 3 1 4,必須這樣定:  
Format("%d %d %d %0:d %3:d", 1, 2, 3, 4) ; 
但用的時候要注意,索引不能超出Args中的個數,不然會引起異常  
Format("this is %2:d %0:d",12,13);  //error
因為Args中僅僅有12 13 兩個數,所以Index僅僅能是01,這里為2就錯了  
[width] 
指定將被格式化的值占的寬度,看一個樣例就明確了  
Format("this is %4d",12);  
輸出是:this is 12  
這個是比較easy。只是假設Width的值小於參數的長度,則沒有效果。  
如:Format("this is %1d",12);  
輸出是:this is 12  
["-"] 
這個指定參數向左齊。和[width]合在一起最能夠看到效果:  
Format("this is %-4d,yes",12);  
輸出是:this is 12 ,yes  

["." prec] 
指定精度,對於浮點數效果最佳:  
Format('this is %.2f',['1.1234]);  
輸出 this is 1.12  
Format('this is %.7f',['1.1234]);  
輸了 this is 1.1234000  

而對於整型數,假設prec比方整型的位數小,則沒有效果  
反之比整形值的位數大,則會在整型值的前面以0補之  
Format('this is %.7d',[1234]);  
輸出是:this is 0001234]  

對於字符型,剛好和整型值相反。假設prec比字符串型的長度大  
則沒有效果,反之比字符串型的長度小。則會截斷尾部的字符  
Format('this is %.2s',['1234']);  
輸出是 this is 12  

而上面說的這個樣例:  
Format('this is %e',[-2.22]);  
返回的是:this is -2.22000000000000E+000  
怎么去掉多余的0呢,這個即可啦  
Format('this is %.2e',[-2.22]);  

好了,第一個總算講完了,應該對他的應用非常熟悉了吧  

m_result.Format("
您選的城市是:\r\n %s,\r\n您選的人是:\r\n%s",city1 +  city2 +  city3,people); 
  UpdateData(0);

格式小結: 
1)最經常使用的格式是%d。含義是以10進制形式打印一個整數。

 
假設輸出的整數是負數,則,輸出的第一個字符就是‘-’ 
2%u格式與%d格式類似,僅僅只是要求打印無符號10進制整數。 
3%o格式請求輸出8進制整數 
4%x%X格式請求輸出16進制整數。

 
%x
格式中用小寫字母a,b,c,d,e,f來表示1015之間的數 
%X
格式中用大寫字母A,B,C,D,E,F來表示1015之間的數 
共同點:8進制和16進制整數總是作為無符號數處理的。

 
5%s格式用於打印字符串,與之相應的參數應該是一個字符指針,待輸出的字符始於該指針所指向的地址。直到出現一個空字符('\0' 
才終止。 
6%c格式用於打印單個字符:比如: 
printf("%c",c); 
等價於 putchar©; 
7%g,%f%e這三個格式用於打印浮點值。 
%g
格式用於打印那些不須要按列對齊的浮點數特別實用。

其作用有二: 
一。去掉該數尾多余的零(沒有達到六位的數) 
二。保留六位有效數字(多余六位的) 
%e
格式用於打印浮點數時。一律顯示地使用指數形式:比如:輸出圓周率時是:3.141593e+00 
兩者的差別: 
%g
格式打印出的數是總共6位有效數字 
%e
格式打印出小數點后的6位有效數字 
%f
禁止使用指數形式來表示浮點數。因此圓周率輸出為:3.141593 
(但注意它的精度要求:也是小數點后6位有效數字) 
8%%格式用於打印一個%字符。 
9%E%G僅僅是在輸出時用大寫字母(E)取代了小寫字母(e) 
另外須要注意的一些知識點

*************************************** 
對齊規則: 
1)當指定寬度大於要輸出位數時,數右對齊,左端補空格 
當前綴'-'號時。想要數左對齊,右端補空格 
大大的前提:僅僅有當指定寬度存在時。前綴'-'才有意義。 
經驗:一般來說,左端對齊的形式看上去要美觀整齊一點。 
*************************************** 
輸出正負號的技巧:(記住)比如: 
printf("%+d %+d %+d\n",-5,0,5); 
僅僅要在中間加個“+”號即可。

作用是輸出符號位(即,數的正負號) 
假設不希望正數的前面出現‘+’號。可用以下的方法 

*************************************** 
僅僅要在中間加個“ ”號(即:空格)即可。(記住)比如: 
作用:假設一個數是非負數,就在它的前面插入一個空格。 
int i; 
for(i=-3;i<=3;i++) 
 printf("% d\n",i); //
注意%d之間有一個空格 
輸出結果例如以下: 
-3 
-2 
-1 




問題:假設‘+’‘ ’同一時候出如今中間時。要以‘+’為准。

 
兩個符號的共同點:用於對齊輸出的數:(尤其對於小數來說) 
 
兩種格式:%+e% e 
C
語言中主要的輸入輸出函數有: 
putchar ():
把變量中的一個字符常量輸出到顯示器屏幕上
getchar ();
從鍵盤上輸入一個字符常量,此常量就是該函數的值
printf ();
把鍵盤中的各類數據,加以格式控制輸出到顯示器屏幕上
scanf ();
從鍵盤上輸入各類數據,並存放到程序變量中
puts ():
把數組變量中的一個字符串常量輸出到顯示器屏幕上
gets ():
從鍵盤上輸入一個字符串常量並放到程序的數組中
sscanf(); 
從一個字符串中提取各類數據。 
 putchar() 
 getchar() 顧名思議就是從輸入流中獲取一個字符和輸出一個字符,比較簡單。不再多講。 
樣例例如以下: 
char c = getchar(); 
putchar©; 
 
格式化輸入輸出scanf()printf()是最實用的,所以重點講一下。 
printf(): 
一般形式
printf("
格式控制".輸出列表);  
eg : printf("a=%d,b=%f,c=%c\n",a,b,c); 
1;
格式控制
格式控制是用雙引號括起來的字符串,也稱"轉換控制字符串",它包括下面兩部分信息
格式說明:由"%"和格式字符組成,%d,%f,%c,他的作用是把輸出數據轉換為指定格式輸出,格式的說明總是由"%"字符開始的.

普通字符:須要原樣輸出的字符,或者是一些有特殊含義的字符,如\n,\t 
2;
輸出列表 
就是須要輸出的一些數據,也能夠是表達式,假設在函數中須要輸出多個變量或表達式,則要用逗號隔開
 
一些特殊字符的輸出: 
單引號,雙引號。和反斜杠的輸出在前面加轉義字符”\” 
如:”\’” , “\”” , “\\” 
%
的輸出用兩個連在一起的%%,即printf(“%%”); 

經常使用的格式說明例如以下
格式字符 
以十進制形式輸出帶符號整數(正數不輸出符號)  
以八進制形式輸出無符號整數(不輸出前綴O)  
以十六進制形式輸出無符號整數(不輸出前綴OX)  
以十進制形式輸出無符號整數  
以小數形式輸出單精度實數  
lf
以小數形式輸出雙精度實數 
以指數形式輸出單、雙精度實數  
%f%e中較短的輸出寬度輸出單、雙精度實數  
輸出單個字符  
輸出字符串  
 
這里強調一下:網上非常多文章都說lf是一樣的,即無論單精度,雙精度浮點數。都能夠用f, 但我在POJ上做過測試,輸出Double時用f確實也能夠 。但讀入時,用f就報WA,所以大家假設對Double進行讀寫的話。都用lf吧。 
說到Double,再啰嗦一句,建議大家要用到浮點數時都用Double。不要用float。由於在非常多情況下。float精度不夠會導致WA 
特殊: 
64位整數的輸入輸出,在POJ上的C++環境下(VC)64位整數是: 
__int64 
(注意int前面是兩個下划線) 
輸入輸出格式為”%I64d”. 
G++環境下(Dev C++) 64位整數是 
long long 
輸入輸出格式為”%lld”. 

輸出寬度 
  用十進制整數來表示輸出的最少位數。

 注意若實際位數多於定義的寬度。則按實際位數輸出, 若實際位數少於定義的寬度則補以空格或0 
精度 
 精度格式符以“.”開頭,后跟十進制整數。意義是:假設輸出數字,則表示小數的位數;假設輸出的是字符, 則表示輸出字符的個數。若實際位數大於所定義的精度數,則截去超過的部分。 
標志格式字符  
結果左對齊,右邊填空格  
輸出符號(正號或負號)空格輸出值為正時冠以空格。為負時冠以負號 
比如: 
double c=24212345.24232; 
printf(“%020.4”); 
表示輸出精確到小數點后4位,輸出占20位,若有空余的位補0. 
 scanf
 
scanf
的非常多使用方法都是和printf相應的。故不再贅述。 
說一下scanf一個特別好用的地方。就是能夠濾去一些不想要的東西。 
舉例說明例如以下: 
比方輸入為日期 yyyy-mm-dd,就能夠這樣寫: 
int year,moth,day; 
scanf(“%d-%d-%d”,&year,&moth,&day); 
再比方: 
scanf("%3d %*3d %2d",&m,&n); 
輸入113 118 69回車(系統將113賦予m,69賦予n,由於*號表示跳過它對應的數據所以118不賦予不論什么變量
puts()
用的不多,且基本都能用printf()取代。故不再多說。

 
gets()
是從輸入流中獲取一行字符串放入字符數組中
char in[100]; 
gets(in); 
大家可能最easy出錯的地方就是字符串的輸入,所以強調一下: 
能進行字符。字符串輸入的有: 
getchar(), scanf(“%c”); scanf(“%s”), gets() 
當中getchar()  scanf(“%c”)的功能是一樣的。 
須要注意的是,這兩個函數讀入的是輸入流中當前位置的字符。 
比方: 
 scanf(“%d”,&n); 
 c = getchar(); 
如果輸入 67/ (如果“/”代表回車),則第一個scanf讀入一個整數67后。當前輸入流的位置是67之后,即指向回車符,所以第二個getchar()讀入的就是一個回車符了,即 c = ‘\n’ 
相同,gets()也是從當前位置讀入一行字符串。 
比方: 
scanf(“%d”,&n); 
gets(str); 
此時讀入字符數組中的字符串就是“\n”  
所以通常在用scanf讀入一個非字符串的類型之后,假設要讀入字符,或字符數組,都用一個額外的getchar()把回車符讀掉,若后面跟的不止一個回車符,可能還有多余的空格的話,就用gets()讀掉。

 
 
和以上不同的是,scanf(“%s”) 讀入的時候是會忽略掉空格,回車和制表符的。而且以空格,回車和制表符作為字符串結束的標志。

 
 
常常會有這種題。輸入第一行是一個整數,接下來每行的第一個是一個字符。用來表示某種操作,后面再跟一些數據。比方: 

A 100 2 
B 23 
A 23 89 
B 34 
像這樣的輸入就須要小心,讀入字符時不要讀成回車符。 
為了防止意外,我通常是這樣處理這類輸入的: 
char model[2]; 
Scanf(“%d”,&n); 
for(…,…,…){ 
 scanf(“%s”,model); 
 if(model[0] == ‘A’){ 

else{ 


 sscanf(): 
sscanf()
經經常使用來分解字符串。功能非常強大,但非常多功能都須要正則表達式的知識,所以就介紹一下最簡單的幾種使用方法,大家假設想了解很多其它的話,自己去網上找吧。

 
1. 
char str[100],str1[100],str2[100]; 
gets(str); 
sscanf(str,”%s%s”,str1,str2); 
將讀入的一整行字符串按空格,制表符或回車符切割成兩個字符串。

 

取指定長度的字符串。如在下例中。取最大長度為4字節的字符串。

 
sscanf("123456 ", "%4s", str);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM