关于删除标点的C++代码中text.erase(i--,1)的逻辑疑问
解析这段删除字符串标点的C++代码逻辑
先贴出你提到的代码:
for(size_t i = 0; i < text.length(); ++i) if(ispunct(text[i])) text.erase(i--, 1);
核心疑惑点在text.erase(i--, 1),这里你搞反了后置递减运算符的执行顺序,拆解一下:
- erase先使用当前i的值:后置递减
i--是先把当前i的数值传递给erase函数,再对i执行减1操作。所以erase删除的是当前i位置的字符(也就是被ispunct判定为标点的字符,比如你示例里的逗号),根本不会碰i减1后位置的字符。 - i--的作用是避免漏检:删除字符串第i位的字符后,原i+1及之后的所有字符都会往前移动一位。如果不调整i,下一次循环执行
++i后,会直接跳过这个前移过来的字符,可能漏检其中的标点。- 拿你给的例子"hello, I am John"来说:当i=5时(对应逗号),执行erase删除逗号后,原i=6的空格会移到i=5的位置。此时i--让i变成4,下一次循环++i后i=5,刚好能检查这个前移过来的空格,不会遗漏任何字符。
总结下这段代码的逻辑:逐个遍历字符串字符,碰到标点就删掉它,同时通过i--抵消循环的++i,保证删除操作后后续字符能被正常遍历检查。
内容的提问来源于stack exchange,提问作者Tùng 01 Vương Trí
相关产品推荐
相关产品推荐

