在C語言中,我們常用scanf和printf函數來進行輸入和輸出,scanf和printf是庫函數,在使用時要包含頭文件<stdio.h>。
例如,我們常常編寫這樣的函數:
如上的程序奔潰了,爲什麼呢?因爲我們的數組中只能包含30個字符,但是我們在輸入的時候輸入了超過30個字符,在我們不知道數組大小的情況下,這樣的代碼是很危險的,就是說,scanf函數是不安全的。
也許讀者會馬上想到fgets函數:
fgets函數不但能夠從我們輸入的超過數組最大值的一段數據中截取29個字符,還能接受小於29個字符的數據:
在C++中爲了解決scanf不安全的問題,發明了string字符串類型。
可以看到string的顏色和int的顏色是不一樣的,因爲string是一個類對象。我們還可以看到string的最大值是1073741820,這個值足以大到一天都輸不完。
在C語言的輸入輸出中對數據的類型有着嚴格的格式控制,相比C++來說是很不方便的:
使用scanf函數,在給兩個不同的變量賦值的時候我們常常用空格或Tab隔開,這樣a和b分別被賦值1和2,但是在下面這種情況裏:
我們可以看到輸入的d被喫掉了,因爲空格也是一個字符,被賦給了d。
我們來看看C++中的cin:
cin函數沒有把空格賦給c,而是把我們輸入的d賦給了c。
關於cout的格式控制:
C語言中printf函數裏的格式控制功能很強大,例如設置域寬及位數,按進制輸出等,當然C++中也有這樣的格式化控制,只是有點複雜而已。
1.設置域寬及位數
setw設置了位寬,效果和printf函數裏%5d一樣。setprecision(n)能夠設置有效位數,setprecision(n)和setiosflags(ios::fixed)一起使用能夠設置小數點後的有效位數。
2.按進制輸出
int i = 100;
cout<<dec<<i<<endl;//十進制
cout<<oct<<i<<endl;//八進制
cou<<hex<<i<<endl;//十六進制
默認輸出十進制。
3.設置填充符
Kyrie Irving___全.