C++读取n个含空格字符串存入vector异常问题求助
问题分析与解决
你的代码出现问题的核心原因是:用cin >> n读取整数后,输入缓冲区里会残留一个换行符。后续执行第一个getline(cin, s)时,会直接读取这个换行符,存入一个空字符串,导致后续循环只能读取到n-1个有效字符串,输出时自然先打印空行,再输出剩下的内容。
解决办法有两种常见方式:
方式一:忽略缓冲区残留的换行符
在cin >> n之后,调用cin.ignore()清除缓冲区里的换行符。如果输入n后可能存在多个空白字符(比如空格+换行),建议用cin.ignore(numeric_limits<streamsize>::max(), '\n'),确保忽略掉换行前的所有空白内容。修正后的代码:
#include <bits/stdc++.h> using namespace std; int main() { int n; cin >> n; // 清除输入n后残留的所有空白直到换行 cin.ignore(numeric_limits<streamsize>::max(), '\n'); vector<string> v; for (int i = 0; i < n; i++) { string s; getline(cin, s); v.push_back(s); } // 用范围for循环遍历输出更简洁 for (const auto& str : v) { cout << str << endl; } }方式二:统一用getline读取输入
先读取包含n的整行字符串,再将其转换为整数,这样就不会留下残留的换行符干扰后续的getline调用。修正后的代码:
#include <bits/stdc++.h> using namespace std; int main() { string n_str; getline(cin, n_str); int n = stoi(n_str); vector<string> v; for (int i = 0; i < n; i++) { string s; getline(cin, s); v.push_back(s); } for (const auto& str : v) { cout << str << endl; } }
内容的提问来源于stack exchange,提问作者user22643044
相关产品推荐
相关产品推荐

