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

仅使用<stdio.h>头文件的C语言字符串去空格方法是否可行?

你的字符串去空格实现的问题与改进建议

你的实现思路方向是对的,但存在几个关键问题,会导致功能异常或者效率不足:

  • 连续空格处理失效:比如输入" test",第一次移除第一个空格后,原本的第二个空格会移到当前i的位置,但你的代码会让i继续递增,导致这个空格被跳过,无法移除。
  • 未处理字符串结束符:如果传入的size是字符数组的总长度,原字符串的'\0'会被移动,移除空格后数组末尾可能残留旧字符;如果size是字符串实际长度(不含'\0'),移完后不手动加'\0'会出现乱码。
  • 效率偏低:每次遇到空格都要把后面所有字符往前移一位,时间复杂度是O(n²),长字符串场景下性能很差。
  • 仅处理单一空白字符:代码只针对' '(空格),但实际空白字符还包括制表符'\t'、换行符'\n'等,若需要处理这类字符,当前逻辑覆盖不到。

改进后的实现(双指针法,仅用<stdio.h>)

int remove_whitespace(char* string, int size)
{
    int i = 0, j = 0;
    int num = 0;

    // 遍历数组,直到碰到字符串结束符或达到数组大小上限
    while (i < size && string[i] != '\0')
    {
        if (string[i] != ' ') 
        {
            // 若要处理所有空白,可修改判断条件为:
            // if (string[i] != ' ' && string[i] != '\t' && string[i] != '\n')
            string[j++] = string[i];
        }
        else
        {
            num++;
        }
        i++;
    }
    // 手动添加字符串结束符,保证输出为合法C字符串
    string[j] = '\0';
    return num;
}

改进点说明

  • 双指针逻辑:i负责遍历原字符串,j记录新字符串的写入位置,非空格字符直接复制,时间复杂度降到O(n),效率大幅提升。
  • 严格处理结束符:最后手动写入'\0',确保输出是合法的C字符串,避免乱码。
  • 连续空格全处理:所有空格都会被统计并跳过,不会遗漏连续空格。
  • 可扩展性:只需修改判断条件,就能轻松支持处理制表符、换行符等其他空白字符。

使用注意

调用时要保证传入的size是字符数组的总大小,避免数组越界;如果传入的是字符串实际长度(不含'\0'),size需要比实际长度大1,预留位置给结束符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 20:21:42