C++:使用指针移除char数组首单词的程序异常排查
问题排查与修正程序
原代码存在的问题
- 开头空格处理逻辑错误:原代码的
while(*p==' ' && *p++==' ')循环完全冗余,且循环体内额外执行p++,导致每个空格会让指针跳两次,逻辑混乱还可能跳过正常字符。正确的处理应该是逐个跳过所有开头空格,直到遇到非空格或字符串结束。 - 跳过首个单词时未判断字符串结束:原代码的
while(*p!=' ')循环没检查是否到达字符串末尾(*p != '\0'),当输入是单个单词或空字符串时,指针会越界访问数组外的内存,读取随机垃圾数据导致输出乱码。 - 未处理边界情况:输入为空、全是空格或只有单个单词时,没有对应处理逻辑,直接输出会引发异常。
修正后的完整程序
#include <iostream> int main() { char sentence[1000]; std::cout << "Input sentence: "; std::cin.getline(sentence, 1000); char *p = sentence; // 跳过开头所有空格 while (*p == ' ') { p++; } // 跳过空格后已到字符串结尾,直接输出空提示 if (*p == '\0') { std::cout << "Sentence without first word: (empty)" << std::endl; return 0; } // 跳过首个单词的所有字符(直到遇到空格或字符串结束) while (*p != ' ' && *p != '\0') { p++; } // 跳过单词后连续空格(可选,不需要保留空格可删除这段) while (*p == ' ') { p++; } std::cout << "Sentence without first word: "; // 输出剩余内容,已到结尾则输出空 while (*p != '\0') { std::cout << *p; p++; } std::cout << std::endl; return 0; }
修正说明
- 开头空格处理改为简洁的循环,逐个跳过所有空格,逻辑清晰无错误。
- 增加字符串结束符判断,跳过空格后直接检查是否为空,避免后续越界。
- 跳过首个单词时同时判断是否到字符串结尾,防止指针越界访问非法内存。
- 可选添加跳过单词后连续空格的逻辑,让输出更整洁(不需要可直接删除)。
- 所有边界情况(空输入、全空格、单个单词)都能正确处理,不会输出乱码。
内容的提问来源于stack exchange,提问作者ginasi
相关产品推荐
相关产品推荐

