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

为何首次按回车后后续cin.get()语句被跳过?(VS2022环境)

cin.get()被直接跳过的原因分析

问题场景

在Visual Studio 2022中运行这段1998年教材里的C++代码时,完成第一个输入并按下回车后,后续的cin.get()语句会直接跳过,不会等待用户输入:

#include <iostream>
using namespace std;

int main()
{
    char string[21];

    cout << "Enter a string: ";
    cin.get(string, 20);
    cin.ignore(80, '\n');

    cout << "\nPress Enter to continue.\n";
    cin.get(string, 20);
    cin.ignore(80, '\n');

    cout << "\nPress Enter to continue.\n";
    cin.get(string, 20);
    cin.ignore(80, '\n');

    cout << "\nPress Enter to continue.\n";
    cin.get(string, 20);
    cin.ignore(80, '\n');
}

核心原因

问题出在cin.get(char*, size)的行为逻辑上:

  • cin.get(char*, size)会从输入缓冲区读取字符,直到遇到默认分隔符'\n'或者读满size-1个字符时停止。关键是,它不会把触发终止的分隔符从缓冲区中移除,这个分隔符会留在缓冲区里。
  • 第一个输入后的cin.ignore(80, '\n')是正确的:它会忽略最多80个字符,直到找到并跳过换行符,清空缓冲区。
  • 后续的“按回车继续”环节:当你直接按回车时,缓冲区里只有一个'\n'。此时cin.get(string,20)一碰到这个分隔符就直接终止读取,不会往string里写入任何内容,同时这个'\n'还留在缓冲区。紧接着的cin.ignore()会跳过这个换行符,导致整个流程看起来像是cin.get()被“跳过”——实际上它是直接触发了终止条件,根本没等待新的输入。

本质是:cin.get(char*, size)把空输入(直接按回车)当成了合法的终止信号,而不是需要等待用户输入有效内容的状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 00:15:19