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

C语言去除字符串空格:为何空格后的内容被一并移除?

问题原因分析

你的代码出现输出截断的问题,核心有两个原因:

  • 索引错位:你用同一个循环变量i同时遍历输入字符串和写入输出字符串。遇到空格时,你跳过写入但i仍在递增,导致WORLD的字符被写到输出字符串的第6位及以后,而输出字符串的第5位(对应原输入的空格位置)是未初始化的垃圾值,大概率是'\0',打印时会在HELLO后直接截断。
  • 缺少字符串终止符+内存分配错误:C语言字符串必须以'\0'结尾才能被正确识别,你既没手动添加这个终止符,malloc的大小也只是原字符串长度,没留额外字节存'\0';另外原字符串包含空格,实际需要的内存应该是非空格字符数+1,用原长度分配不仅浪费内存,还会因缺少终止符引发未定义行为。
修正后的代码
char *no_space(const char *str_in)
{
    // 统计非空格字符数量
    int non_space_count = 0;
    for (int i = 0; str_in[i] != '\0'; i++) {
        if (str_in[i] != ' ') {
            non_space_count++;
        }
    }

    // 分配内存:非空格字符数 + 1(用于存'\0')
    char *noSpace_str = malloc((non_space_count + 1) * sizeof(char)); 
    if (noSpace_str == NULL) { // 检查内存分配是否成功
        return NULL;
    }

    // 用独立索引控制输出字符串的写入位置
    int idx = 0;
    for (int i = 0; str_in[i] != '\0'; i++) {
        if (str_in[i] != ' ') {
            noSpace_str[idx++] = str_in[i];
        }
    }
    noSpace_str[idx] = '\0'; // 添加字符串终止符

    return noSpace_str;
}
关键修正说明
  • 新增非空格字符统计:确保内存分配大小刚好够用,避免浪费。
  • 使用独立的idx变量:遇到空格时idx不递增,保证有效字符连续写入输出字符串。
  • 添加'\0'终止符:让返回的字符串符合C语言字符串规范。
  • 增加malloc空指针检查:避免内存分配失败后操作空指针,是C语言动态内存操作的良好习惯。

内容的提问来源于stack exchange,提问作者odradek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 03:21:03