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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 03:01:00