C++字符遍历代码输出异常:预期Heo Word却得到eo World
问题原因分析&修复方案
你的问题出在指针后置递增运算符++的执行顺序上,咱们一步一步拆解:
核心问题
看这段关键代码:
while ( *p++ ) { if ( *p != 'l' ) cout << *p; }
*p++是后置递增,它的执行逻辑是:
- 先读取当前
p指向的字符(比如第一次循环时是'H'),用这个值判断循环条件(非空则继续) - 再把指针
p向后移动一位,指向当前字符的下一个
这就导致:
- 第一次循环直接跳过了第一个字符'H':判断完'H'存在后,
p已经移到了'e',循环体内输出的是'e',完全没处理'H' - 后续的字符判断也整体偏移了一位:原字符串里的第一个'l',循环体里判断的其实是第二个'l',最终就出现了
eo World的错误输出
修复方案
咱们只需要调整指针递增的时机,确保先处理当前字符,再移动指针。有两种常见写法:
写法1:把递增放在循环体末尾
#include <iostream> using namespace std; int main() { char str[] = "Hello World\n"; char* p = str; while ( *p ) { // 先判断当前字符是否有效 if ( *p != 'l' ) cout << *p; p++; // 处理完再移动指针 } }
写法2:用for循环更简洁
#include <iostream> using namespace std; int main() { char str[] = "Hello World\n"; for (char* p = str; *p; ++p) { // 前置递增,逻辑更直观 if (*p != 'l') cout << *p; } }
这两种写法都会先处理当前指针指向的字符,再移动指针,最终就能得到预期的Heo Word输出。
内容的提问来源于stack exchange,提问作者ZAX9732
相关产品推荐
相关产品推荐

