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
相关产品推荐
相关产品推荐

