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

C++多行输入读取异常问题及std::string实现咨询

C++多行输入读取问题解析

问题根源

使用std::cin >> n读取整数后,输入缓冲区会残留一个换行符。后续第一个std::cin.getline()会直接读取这个空换行作为一行内容,循环再执行n-1次后结束,导致实际只读取到n-1行有效数据。

基于char数组的修复方案

读取n后,需要跳过缓冲区里的换行符,可通过std::cin.ignore()实现:

#include<iostream>
#include<string>

int main() {
    int n, k = 8;
    std::cin >> n;
    // 跳过数字后的换行符
    std::cin.ignore();
    
    char lines[n][k]; // 注:这是编译器扩展特性,标准C++不支持变长数组
    for(int i = 0; i < n; i++) 
        std::cin.getline(lines[i], k);
}

用std::string实现的正确方式

完全不需要std::string *lines[n](这是不必要的指针数组),推荐使用std::vector<std::string>来存储行数据,符合C++标准且更安全:

#include<iostream>
#include<string>
#include<vector>

int main() {
    int n;
    std::cin >> n;
    std::cin.ignore(); // 同样需要跳过换行符
    
    std::vector<std::string> lines(n);
    for(int i = 0; i < n; i++) {
        std::getline(std::cin, lines[i]);
    }
}

如果坚持用数组(不推荐,依赖编译器扩展),可以直接声明std::string lines[n];,但这种写法不符合C++标准,移植性差。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 05:26:27