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'