C++中string::find函数关联变量与cout时输出结果不一致问题
问题分析与解决
这个差异完全是类型转换导致的,代码存在类型不匹配的问题,具体原因如下:
std::string::find的返回值类型std::string::find的返回值是size_t,这是一个无符号整数类型(通常等价于unsigned long long)。当找不到目标子串时,它会返回std::string::npos——这个常量本质是size_t类型的最大值,也就是你看到的18446744073709551615。直接输出 vs 赋值给
int的区别- 直接输出
find的返回值时,因为是无符号类型,会直接输出它的真实数值; - 当把这个无符号的最大值赋值给
int类型变量时,会触发无符号转有符号的类型转换:size_t的最大值被转换为int类型能表示的最小值,也就是-1,所以输出这个int变量时显示的是-1。
- 直接输出
查找存在子串时输出一致的原因
当子串存在时,find返回的是正整数索引,这个值在size_t和int的表示范围内,所以两种输出方式结果一致。
正确写法示例
应该使用size_t类型存储find的返回值,这是C++标准库的规范用法,同时判断是否找到子串应该用string::npos:
#include<iostream> using namespace std; int main() { string name = "For all the times"; size_t pos = name.find("ball", 0); cout << "Line 6 output : " << pos << endl; cout << "Line 8 output : " << pos; // 正确判断子串是否存在的方式 if (pos == string::npos) { cout << "\nSubstring not found"; } return 0; }
内容的提问来源于stack exchange,提问作者Hruthik Reddy
相关产品推荐
相关产品推荐

