我們首先來考慮一個實際的問題,代碼如下
char ch[10];
cin.getline(ch,10);
如果我們輸入為"0123456789"
,ch[10]里面的數據存儲應該為"012345678\0"
,因為我們輸入的字符串實際上是"0123456789\n"
,這里很顯然是超出了輸入長度,cin.getline()會發生數據截斷。正確的極限輸入應該是"012345678\n"
,getline()將'\n'
替換成'\0'
,此時緩沖區沒有'\n'
,('\n'
被cin.getline吃了,消化成了'\0'
).
我們再來考慮如下的情形:
char ch[10];
cin.getline(ch,12);
如果我們輸入的是"0123456789a\n"
,一共12個字符,包括'\n'
(這是極限輸入),但是ch[10]里面的值是"0123456789"
結論如下
cin.getline()會根據參數對輸入產生截斷,不考慮ch的存儲空間,先將輸入轉換為"xxxx\0"
的格式,然后將前到后賦給ch(原理應該是這樣子的),所以ch中不一定有'\0'
。
那么,如何科學的使用cin.getline()呢?
如果字符串是不超過i個大小,那么我們應該定義ch[i+1],為'\0'
預留一個空間,此時我們應該使用cin.getline(ch,j),此時應該滿足j>=i+1包括i個數據和'\0'
.
// 如果要求不超過100個數據,應該如下定義
char ch[101]; // 包括100個數據和一個'\0'
cin.getline(ch,101) // 包括100個數據和一個'\0'