C 語言字串去除空格完整解法:移除所有空格與修剪首尾空白兩種需求
需求一:移除所有空白字元 (含定位鍵、換行)
void remove_all_space(char *dst, const char *src) {
while (*src) {
if (!isspace((unsigned char)*src)) *dst++ = *src;
++src;
}
*dst = '\0';
}
需求二:修剪首尾空白,保留中間 (類似 Python strip)
void trim(char *dst, const char *src) {
// 找第一個非空白
const char *start = src;
while (*start && isspace((unsigned char)*start)) ++start;
// 找最後一個非空白
const char *end = src + strlen(src) - 1;
while (end >= start && isspace((unsigned char)*end)) --end;
// 複製
size_t len = (end >= start) ? (end - start + 1) : 0;
for (size_t i = 0; i < len; ++i) dst[i] = start[i];
dst[len] = '\0';
}
完整測試程式
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main() {
const char *test = " \tHello World\n ";
char buf1[100], buf2[100];
remove_all_space(buf1, test);
printf("移除所有: [%s]\n", buf1); // [HelloWorld]
trim(buf2, test);
printf("修剪首尾: [%s]\n", buf2); // [Hello World]
return 0;
}
關鍵點
- 使用
isspace 支援所有空白字元 (空格、\t、\n、\r、\v、\f)。
(unsigned char) 轉型避免負值導致未定義行為。
- 原地修改版本需小心來源與目的地重疊,建議用輔助緩衝區或逆向複製。
- C++ 可用
std::string + erase/remove_if 或 Boost trim。