C++调用cin.getline读取字符数组时末尾字符丢失原因
C++ cin.getline读取字符串丢失末尾字符问题排查
相关实现代码
#include<iostream> using namespace std; int main() { int n; cin>>n; cin.ignore(); char arr[n+1]; cin.getline(arr,n); cin.ignore(); cout<<arr; return 0; }
测试情况
- 测试输入:
11 of the year
- 实际运行输出:
of the yea
核心原因
问题出在对cin.getline()的参数规则理解偏差:cin.getline(char* buf, int maxCnt)的读取逻辑是:最多从输入流中读取 maxCnt - 1 个有效字符,读取完成后自动在写入的有效字符末尾补'\0'字符串终止符,这个读取上限和你实际给数组开了多大空间没有关联,完全由传入的第二个参数决定。
你传入的第二个参数是n(测试场景下n=11),函数最多只会读取10个有效字符就停止。数一下测试输入的字符串of the year的长度:算上中间的两个空格,总共有11个有效字符,读取到第10个字符a就触发了长度上限,自然会把最后一个r丢掉,最终输出就是of the yea。
另外你在cin.getline()后面多写的一次cin.ignore()属于冗余代码:cin.getline()本身会把触发读取停止的换行符从输入缓冲区中丢弃,不需要额外调用ignore跳过,多写这一句如果后续还有读取操作,反而会吞掉下一段输入的第一个字符。
修复方案
把cin.getline(arr,n);改成cin.getline(arr, n+1);即可,此时传入的最大读取长度和数组的实际长度一致,函数会最多读取n个有效字符,刚好匹配预留的数组空间,也能完整存下长度为n的输入字符串。同时删掉getline后面多余的cin.ignore()调用。
内容的提问来源于stack exchange,提问作者Purushottam Nawale
相关产品推荐
相关产品推荐

