You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++:使用指针移除char数组首单词的程序异常排查

问题排查与修正程序

原代码存在的问题

  1. 开头空格处理逻辑错误:原代码的while(*p==' ' && *p++==' ')循环完全冗余,且循环体内额外执行p++,导致每个空格会让指针跳两次,逻辑混乱还可能跳过正常字符。正确的处理应该是逐个跳过所有开头空格,直到遇到非空格或字符串结束。
  2. 跳过首个单词时未判断字符串结束:原代码的while(*p!=' ')循环没检查是否到达字符串末尾(*p != '\0'),当输入是单个单词或空字符串时,指针会越界访问数组外的内存,读取随机垃圾数据导致输出乱码。
  3. 未处理边界情况:输入为空、全是空格或只有单个单词时,没有对应处理逻辑,直接输出会引发异常。

修正后的完整程序

#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 10:07:25