C++检查字符串中所有'a'均在'b'之前:代码多输出一个true求助
问题分析与修复
问题根源
你的代码多输出一个true的核心原因是输入处理时的缓冲区残留问题:
- 用
cin >> n读取整数后,输入缓冲区会残留一个换行符(\n)。 - 后续第一个
getline(cin, item)会直接读取这个换行符对应的空字符串,导致vec中多了一个空元素。 - 空字符串里找不到
"ba"子串,因此会额外输出一个true。
同时你的循环条件存在错误:
- 读取n个字符串的循环用了
i <= n,会多执行一次,总共读取n+1个元素。 - 遍历输出
vec的循环同样用了j <= n,存在越界访问风险。
修复后的代码
#include <iostream> #include <string> #include <vector> using namespace std; int main() { vector<string> vec; int n; string item; cout << "n: "; cin >> n; // 清除cin>>n后残留的换行符 cin.ignore(); cout << "Enter " << n << " strings:" << endl; // 修正循环条件,读取n个字符串 for(int i = 0; i < n; i++){ getline(cin, item); vec.push_back(item); } // 用vec.size()作为遍历边界,避免越界 for (size_t j = 0; j < vec.size(); j++) { cout << vec[j] << " "; } cout << endl; for (const auto& s : vec) { if (s.find("ba") != string::npos) cout << "false "; else cout << "true "; } return 0; }
关键修复点
- 添加
cin.ignore():处理cin >> n后残留的换行符,确保第一个getline能正确读取用户输入的字符串。 - 修正循环条件:将
i <= n改为i < n,保证只读取n个字符串;遍历输出时依赖vec.size()作为边界,更安全。 - 用
const auto&遍历字符串:避免不必要的字符串拷贝,提升运行效率。 - 输出添加空格分隔:让结果更清晰易读。
逻辑正确性验证
你核心的判断逻辑(检查是否存在"ba"子串)是完全正确的:
- 只要字符串中出现
'b'在'a'之前的情况,必然包含"ba"子串,返回false。 - 空字符串、全
a、全b、所有a都在b之前的字符串,都不会包含"ba",返回true,完全符合需求。
内容的提问来源于stack exchange,提问作者Teo
相关产品推荐
相关产品推荐

