C++中string::find行为表现不一致的原因是什么?
问题根源分析:不是
string::find异常,是你的代码逻辑错了 嘿,我看了你的代码和描述,立刻就发现问题所在了——你遇到的“异常”根本不是std::string::find的行为有问题,而是你的判断条件写反了,还误用了无符号类型的返回值,才导致结果不符合预期。
1. 无符号类型比较的坑
std::string::find返回的是size_t类型,这是一个无符号整数。当找不到匹配字符时,它会返回std::string::npos——这个值本质上是把-1强制转换成无符号类型,所以它是一个超级大的正数(比如32位系统上是4294967295)。
你代码里写了alpha_sym.find(example[i]) >= 0,但因为size_t是无符号的,这个判断永远是真——无符号数不可能小于0啊!这就导致第一个条件完全失效,根本没法区分“找到”和“没找到”的情况。
2. 长度比较对象搞反了
第二个致命错误是:你用example.size()来和find的结果比较,这完全错了!我们是在alpha_sym这个字符串里找字符,所以找到的位置肯定要小于alpha_sym.size(),而不是原字符串example的长度啊!
举个你提到的例子:
- 当你检查"1435+212"里的字符是否在"01234567+_"中时,
alpha_sym的长度是10,example的长度是8。字符'+'在alpha_sym里的位置是8,这时候你判断8 < 8(因为example.size()是8),结果是false,所以即使字符存在,也会进入else分支,输出“不在符号集中”——这就是你觉得“异常”的原因!
修复后的代码
把判断逻辑改成正确的写法,顺便优化几个小问题:
#include <string> // 确保包含必要的头文件 using namespace std; // 如果你的代码里没写的话 bool check_tape(char* tape) { int test8; cout << example << " " << example.size() << " " << alpha_sym << endl; cin >> test8; // 临时暂停程序 int err = 0; for (int i = 0; i < example.size(); i++) { size_t pos = alpha_sym.find(example[i]); // 先存结果,避免重复调用find if (pos != string::npos) { // 直接用npos判断是否找到 cout << pos << endl; } else { cout << example[i] << " " << i << " 不在符号集中" << endl; err++; } } // 原代码不管对错都返回1,这完全失去了错误检查的意义 return err == 0; // 没错误返回true,有错误返回false }
另外提几个小细节:
- 原代码里
err += 0是完全无用的代码,可以删掉; - 重复调用
alpha_sym.find(example[i])会浪费性能,先把结果存在变量里更高效; - 布尔函数通常用
true表示成功,false表示失败,原代码不管错误与否都返回1(也就是true),这完全没起到检查的作用。
内容的提问来源于stack exchange,提问作者AWRDev.
相关产品推荐
相关产品推荐

