如何在C语言中去除字符串空格并生成精确长度无尾空格新数组
C语言字符串处理:创建匹配长度数组与去除空格方案
一、创建与去尾空格后长度一致的新数组
核心思路是先处理原字符串的末尾空格,再根据有效长度分配内存创建新数组,具体步骤如下:
- 读取并预处理输入:用
fgets读取用户输入到原数组,先移除fgets自动读入的换行符。 - 截断末尾空格:从字符串末尾向前遍历,定位第一个非空格字符,将其后一位设为字符串终止符
'\0',得到去除尾空格的有效字符串。 - 创建匹配长度的新数组:计算有效字符串长度,用
malloc分配对应内存(需额外+1存储终止符),最后复制字符串到新数组。
示例代码:
#include <stdio.h> #include <string.h> #include <stdlib.h> int main() { char input[100]; // 读取用户输入,避免超出数组边界 fgets(input, sizeof(input), stdin); // 先移除末尾的换行符(如果存在) size_t len = strlen(input); if (len > 0 && input[len-1] == '\n') { input[len-1] = '\0'; len--; } // 移除末尾所有空格 while (len > 0 && input[len-1] == ' ') { len--; } input[len] = '\0'; // 截断到有效长度 // 分配内存创建新数组 char *new_arr = malloc(len + 1); if (new_arr == NULL) { perror("内存分配失败"); return 1; } strcpy(new_arr, input); printf("处理后的字符串:'%s'\n", new_arr); printf("新数组实际长度:%zu\n", strlen(new_arr)); free(new_arr); // 释放动态分配的内存 return 0; }
二、去除字符串中的所有空格
去除所有空格(含开头、中间、末尾)有两种常用实现方式:
方式1:原地修改(无需额外内存)
用双指针法,一个指针遍历原字符串,另一个指针仅写入非空格字符,最后补终止符。
示例代码:
#include <stdio.h> void remove_all_spaces(char *str) { char *write_ptr = str; // 遍历每个字符 for (char *read_ptr = str; *read_ptr != '\0'; read_ptr++) { if (*read_ptr != ' ') { *write_ptr++ = *read_ptr; } } *write_ptr = '\0'; // 终止处理后的字符串 } int main() { char input[100] = " Hello World! "; remove_all_spaces(input); printf("去除所有空格后:'%s'\n", input); // 输出'HelloWorld!' return 0; }
方式2:创建新数组(不修改原字符串)
先统计原字符串中非空格字符的数量,分配对应内存后,仅复制非空格字符到新数组。
示例代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> char *remove_all_spaces_new(const char *str) { // 统计非空格字符数 size_t non_space_cnt = 0; for (const char *p = str; *p != '\0'; p++) { if (*p != ' ') { non_space_cnt++; } } // 分配内存 char *new_str = malloc(non_space_cnt + 1); if (new_str == NULL) { return NULL; } // 复制非空格字符 char *write_ptr = new_str; for (const char *read_ptr = str; *read_ptr != '\0'; read_ptr++) { if (*read_ptr != ' ') { *write_ptr++ = *read_ptr; } } *write_ptr = '\0'; return new_str; } int main() { char input[100] = " Hello World! "; char *result = remove_all_spaces_new(input); if (result != NULL) { printf("去除所有空格后的新数组:'%s'\n", result); free(result); // 释放内存 } return 0; }
内容的提问来源于stack exchange,提问作者Jacob Mohamed
相关产品推荐
相关产品推荐

