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

为什么我的C++程序输入内容输出时会丢失第一个字符?

C++输入内容丢失首字符问题原因及修复方案

问题原因

  • 核心诱因是多余的std::cin.ignore()调用:ignore()方法默认会从输入缓冲区丢弃1个字符。你当前的代码在调用getline读取用户输入前,输入缓冲区没有任何残留数据,此时调用ignore会直接吃掉用户输入的第一个字符,比如输入123时,第一个字符1被丢弃,getline只能读到剩下的23,就会出现首字符丢失的现象。
  • 补充冗余代码说明:val[strlen(val)] = '\0'是完全多余的操作,std::cin.getline读取完成后会自动在字符串末尾追加\0终止符,不需要手动添加。

修复方案

分两种场景选择对应修复方式:

场景1:当前代码为独立逻辑,之前没有其他输入操作

直接删除std::cin.ignore();这一行即可,修复后参考代码:

char* val = new char[20];
std::cout << " enter item number : ";
std::cin.getline(val, 20);
std::cout << val;
// 注意:动态申请的堆内存用完后记得调用delete[] val释放,避免内存泄漏

场景2:代码之前有其他输入操作(比如用std::cin >>读取过整数,缓冲区残留了换行符)

此时不能直接删除ignore,需要调整ignore的调用逻辑,只丢弃缓冲区残留的换行符,避免误删用户输入的有效字符,需要先引入<limits>头文件,修改ignore调用逻辑:

#include <limits>
// 其他原有代码
char* val = new char[20];
std::cout << " enter item number : ";
// 仅丢弃缓冲区中直到换行符的所有残留内容,不会误吞用户后续输入的有效字符
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cin.getline(val, 20);
std::cout << val;

内容的提问来源于stack exchange,提问作者Seneth_lakshan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 14:48:05