cin.getline()的用法和坑


cin.getline()的用法和坑
cin.getline大致原型:istream& getline (char\* s, streamsize n, char delim='\n'),其中s是字符串的首地址,n是輸入長度,delime是定界符(缺省是\n)

我們首先來考慮一個實際的問題,代碼如下

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'


免責聲明!

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



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