You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 11:01:07