cin.getline()的用法和坑

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

cin.getline()的用法和坑

泠月Des   2020-04-01 我要评论
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' ```

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们