提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 结论
- 原因:Qt 对 `chop` 做了边界安全处理
- 代码示例验证
- 补充:QString 其他函数的边界行为
结论
QString::chop(int n) 不会因为字符串为空、或字符串长度小于n而崩溃。
当字符串长度小于n(包括空字符串)时,chop(n)会直接将字符串清空(等价于调用clear());只有当n ≤ 0时,chop会直接返回,不做任何操作。
原因:Qt 对chop做了边界安全处理
QString::chop的底层实现会先计算新的字符串长度(newLen = qMax(0, length() - n)),再通过truncate(newLen)截断字符串。由于qMax(0, ...)保证了newLen不会是负数,因此不会出现越界访问,自然不会崩溃。
以 Qt 5/6 的源码为例,chop的核心实现如下:
voidQString::chop(intn){if(n<=0)return;// n≤0时直接返回,不操作constintnewLength=qMax(0,size()-n);// 保证新长度≥0truncate(newLength);// 截断到新长度,安全操作}代码示例验证
#include<QCoreApplication>#include<QString>#include<QDebug>intmain(intargc,char*argv[]){QCoreApplicationa(argc,argv);// 场景1:空字符串调用chop(5)QString str1;str1.chop(5);qDebug()<<"空字符串chop(5)结果:"<<str1;// 输出:""(仍为空)// 场景2:字符串长度小于5(长度3)QString str2="abc";str2.chop(5);qDebug()<<"长度3的字符串chop(5)结果:"<<str2;// 输出:""(被清空)// 场景3:正常情况(长度8)QString str3="abcdefgh";str3.chop(5);qDebug()<<"长度8的字符串chop(5)结果:"<<str3;// 输出:"abc"// 场景4:n≤0(无操作)QString str4="hello";str4.chop(-2);qDebug()<<"chop(-2)结果:"<<str4;// 输出:"hello"returna.exec();}补充:QString 其他函数的边界行为
QString 的修改类函数(如chop、truncate、left、right)大多做了边界安全处理,不会崩溃;但访问类函数需注意:
QString::operator[]:调试模式下索引越界会触发断言失败(ASSERT),发布模式下行为未定义(可能返回随机字符)。QString::at(int i):索引越界时会抛出std::out_of_range异常(Qt 5.10+),调试模式也会触发断言。
因此,使用operator[]或at()时需先判断索引是否在有效范围内,而chop无需担心边界问题。