仅使用<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
相关产品推荐
相关产品推荐

