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'
我来评几句
登录后评论

已发表评论数()

相关站点

热门文章