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

C++代码问题:循环i=0时未读取输入,直接进入i=1迭代

问题分析与解决方案

这个问题我太熟悉了——混合使用cin >>和getline时很容易踩这个坑!

问题根源

当你用cin >> n读取整数时,输入缓冲区里会留下用户输入完n后按下的换行符。接下来第一次执行getline(cin, q)时,它会直接读取这个残留的换行符作为空字符串存入vector,所以看起来好像i=0时没获取输入就跳到了i=1的循环。

两种可行的解决方案

方案1:清除输入缓冲区的残留换行符

在cin >> n之后,用cin.ignore()清除缓冲区里的换行符(如果需要确保清除所有残留字符,推荐用带参数的版本):

#include <bits/stdc++.h> 
using namespace std; 

int main() { 
    int n; 
    cin >> n; 
    // 清除缓冲区中直到换行符的所有字符(包括换行符本身)
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    vector<string> x; 
    string q; 
    for(int i=0; i<n; i++) { 
        getline(cin, q); 
        x.push_back(q); 
        cout << x.size(); 
    } 
    for(int i=0; i<x.size(); i++) 
        cout << x[i] << endl; 
    return 0; 
}

numeric_limits<streamsize>::max()需要包含<limits>头文件,但因为你已经包含了<bits/stdc++.h>,所以不用额外添加。

方案2:全程使用getline读取输入

避免混合使用两种输入方式,先读取整行作为字符串,再转换成整数n:

#include <bits/stdc++.h> 
using namespace std; 

int main() { 
    string n_str;
    getline(cin, n_str);
    int n = stoi(n_str); // 将字符串转换为整数
    vector<string> x; 
    string q; 
    for(int i=0; i<n; i++) { 
        getline(cin, q); 
        x.push_back(q); 
        cout << x.size(); 
    } 
    for(int i=0; i<x.size(); i++) 
        cout << x[i] << endl; 
    return 0; 
}

这个方案更统一,彻底避免了缓冲区残留的问题,适合需要读取多行文本的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:05:57