Live2D

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'
posted @ 2020-04-01 19:27  泠月Des  阅读(1997)  评论(0编辑  收藏  举报