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

C++中使用find_first_of匹配动态字符串,验证字符顺序是否合规

解决字符串顺序匹配问题的代码修正

我来帮你排查这段代码的问题,顺便给出符合需求的修正版本~

首先明确你的核心需求:检查输入的code字符串中的字符是否按精确顺序出现在目标字符串str中(字符不需要连续,只要先后顺序一致即可)。

原代码的两个关键问题

  • temp字符串未正确初始化:你定义了string temp;但没有为它分配存储空间,直接用temp[k] = str[pos];会访问超出字符串范围的内存,属于未定义行为,这就是为什么temp输出只有换行的原因。
  • find_first_of用法不符合需求:str.find_first_of(code, pos)是从pos位置开始查找code中任意一个字符,而不是你需要的code[k]这个特定字符。比如code是ABC时,它可能先匹配到C,完全破坏了顺序匹配的要求。

修正后的代码

#include <iostream>
#include <string>
using namespace std;

int main() {
    string code, str, temp;
    int pos = 0;
    bool isMatched = true;

    cin >> code >> str;

    // 遍历code中的每个字符,按顺序查找
    for (char targetChar : code) {
        // 从当前pos位置开始,查找特定的目标字符
        pos = str.find(targetChar, pos);
        // 如果找不到该字符,直接标记不匹配并跳出循环
        if (pos == string::npos) {
            isMatched = false;
            break;
        }
        // 将找到的字符添加到temp中(用于调试输出)
        temp += targetChar;
        // 下一次查找从当前位置的下一个字符开始,避免重复匹配同一个位置
        pos++;
    }

    cout << temp << endl; // 现在能正确输出匹配到的序列了
    if (isMatched) {
        cout << "PASS" << endl;
    } else {
        cout << "FAIL" << endl;
    }

    return 0;
}

关键修改说明

  1. 正确构建temp字符串:用temp += targetChar代替下标赋值,让字符串自动扩展存储空间,避免越界问题。
  2. 替换为find函数:str.find(targetChar, pos)会精准查找当前需要的单个字符,确保按code的顺序匹配。
  3. 增加匹配失败的提前判断:一旦某个字符找不到,直接标记isMatched为false并终止循环,提升效率。
  4. 更简洁的遍历方式:使用范围for循环遍历code的字符,比原有的while循环更直观易读。

测试示例

  • 输入:ABC HAPPYBIRTHDAYCACEY → 输出ABC和PASS
  • 输入:ABC TRAGICBIRTHDAYCACEY → 输出A和FAIL(因为A之后找不到B,先出现了C)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:56:11