方法1:去除所有空格(包括中间空格)
遍历字符串,跳过所有空格字符,将非空格字符前移。
#include <stdio.h>
#include <string.h>
void remove_all_spaces(char *str) {
int i = 0, j = 0;
while (str[i]) {
if (str[i] != ' ') {
str[j++] = str[i];
}
i++;
}
str[j] = '\0'; // 添加字符串结束符
}
int main() {
char str[] = " H e l l o W o r l d! ";
remove_all_spaces(str);
printf("去除所有空格后: %s\n", str); // 输出: HelloWorld!
return 0;
}
方法2:去除前导和尾随空格(保留中间空格)
- 去除前导空格:找到第一个非空格字符的位置。
- 去除尾随空格:从字符串末尾向前跳过空格。
- 截断字符串:在新的结束位置添加
\0。
#include <stdio.h>
#include <string.h>
void trim_spaces(char *str) {
int start = 0, end = strlen(str) - 1;
// 去除前导空格
while (str[start] == ' ') {
start++;
}
// 去除尾随空格
while (end >= start && str[end] == ' ') {
end--;
}
// 截断字符串
str[end + 1] = '\0';
// 如果前导空格存在,前移字符串
if (start > 0) {
memmove(str, str + start, end - start + 1);
str[end - start + 1] = '\0';
}
}
int main() {
char str[] = " Hello World! ";
trim_spaces(str);
printf("去除首尾空格后: %s\n", str); // 输出: Hello World!
return 0;
}
方法3:原地去除中间连续空格(保留单个空格)
适用于需要压缩连续空格为单个空格的情况(如处理用户输入)。
#include <stdio.h>
#include <string.h>
void remove_extra_spaces(char *str) {
int i = 0, j = 0;
int space_flag = 0; // 标记前一个字符是否为空格
while (str[i]) {
if (str[i] != ' ') {
str[j++] = str[i];
space_flag = 0;
} else if (!space_flag) {
// 如果当前是空格且前一个不是空格,则保留一个空格
str[j++] = ' ';
space_flag = 1;
}
i++;
}
str[j] = '\0';
}
int main() {
char str[] = " Hello World! ";
remove_extra_spaces(str);
printf("压缩连续空格后: %s\n", str); // 输出: Hello World!
return 0;
}
| 方法 | 功能 | 适用场景 |
|---|---|---|
| 方法1 | 去除所有空格 | 需要完全无空格的字符串(如处理编码) |
| 方法2 | 去除首尾空格 | 清理用户输入(如命令行参数) |
| 方法3 | 压缩连续空格 | 格式化文本(如处理自然语言) |
根据需求选择合适的方法,注意字符串的内存边界(确保不会越界)。
