关于string::size()、length()以及find()系函数使用上的注意事项

不行这个问题我一定要记下来!

能让我产生这个想法的,是上个礼拜在手敲KMP的时候,因为我把模式串的首元素标为-1,于是我的代码在KMP循环的时候总会诡异地再跑完整个字符串前跳出,经过不断地检查,我发现代码执行的时候出现了这个诡异的bug:

-1 < 3 = 0

???-1<3结果为假?难道我的电脑有它自己的想法?

当时我的判断是这么写的:

if (j < str.length())

后来身后地大佬建议我写成这样:

int len = str.length();
if (j < len)

然后奇迹般地好了……好了……了……

后来查阅了C++ Reference后,发现 string::length() 返回的是一个无符号整形,于是这个问题也就解开了。

int a = -1;
unsigned int b = 3;
cout<<(a

经过推测,大概是编译器会在比较前,将带负数的 int 强制转换为 unsigned int ,后果不言而喻。

此外,继续浏览后发现,size()find() 系的函数返回的都是无符号整形,这点在今后也要格外注意,不然又要挠破头皮了。

你可能感兴趣的:(关于string::size()、length()以及find()系函数使用上的注意事项)