cin.getline()的用法和坑
cin.getline大致原型:**istream& getline (char* s, streamsize n, char delim='\n');**`其中s是字符串的首地址,n是输入长度,delime是定界符(缺省是\n)`
我们首先来考虑一个实际的问题,代码如下
```C++
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'`).
我们再来考虑如下的情形:
```C++
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'`.**
```C++
// 如果要求不超过100个数据,应该如下定义
char ch[101]; // 包括100个数据和一个'\0'
cin.getline(ch,101) // 包括100个数据和一个'\0'
```