我們首先來考慮一個實際的問題,代碼如下
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'
