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; }
关键修改说明
- 正确构建
temp字符串:用temp += targetChar代替下标赋值,让字符串自动扩展存储空间,避免越界问题。 - 替换为
find函数:str.find(targetChar, pos)会精准查找当前需要的单个字符,确保按code的顺序匹配。 - 增加匹配失败的提前判断:一旦某个字符找不到,直接标记
isMatched为false并终止循环,提升效率。 - 更简洁的遍历方式:使用范围
for循环遍历code的字符,比原有的while循环更直观易读。
测试示例
- 输入:
ABC HAPPYBIRTHDAYCACEY→ 输出ABC和PASS - 输入:
ABC TRAGICBIRTHDAYCACEY→ 输出A和FAIL(因为A之后找不到B,先出现了C)
内容的提问来源于stack exchange,提问作者user9231414
相关产品推荐
相关产品推荐

