如何从已读取的字符数组中移除标点并创建新数组?
移除字符数组中的标点符号,生成新数组的几种实现方式
嘿,这个需求其实挺常见的,我来给你分享几个实用的实现思路,都是C语言里比较常规的做法:
方法一:手动遍历+自定义标点判断
如果想精准控制哪些字符算“标点”(比如只移除单引号,或者自定义其他符号),可以手动遍历原数组,逐个判断并复制到新数组:
#include <stdio.h> #define SIZE 4096 int main() { char array[SIZE]; char new_array[SIZE]; // 定义新数组,大小和原数组一致足够用 fgets(array, SIZE, stdin); int i = 0; // 原数组的遍历索引 int j = 0; // 新数组的写入索引 // 遍历原数组直到遇到字符串结束符 while (array[i] != '\0') { // 判断当前字符是不是要移除的标点(这里以单引号为例,可扩展其他符号) if (array[i] != '\'') { new_array[j++] = array[i]; } i++; } new_array[j] = '\0'; // 别忘了给新数组加字符串结束符! // 测试输出 printf("处理后的数组内容:%s\n", new_array); return 0; }
如果需要移除所有常见标点,可以把判断条件改成多个符号的或运算,比如:
if (array[i] != '\'' && array[i] != ',' && array[i] != '.' && array[i] != '!' && ...)
方法二:利用标准库函数ispunct()简化判断
C标准库的<ctype.h>头文件里提供了ispunct()函数,能直接判断一个字符是不是标点符号(包含单引号、逗号、句号等所有常见标点),用这个会更简洁:
#include <stdio.h> #include <ctype.h> // 引入ispunct所需的头文件 #define SIZE 4096 int main() { char array[SIZE]; char new_array[SIZE]; fgets(array, SIZE, stdin); int i = 0, j = 0; while (array[i] != '\0') { // 如果不是标点字符,就复制到新数组 if (!ispunct((unsigned char)array[i])) { new_array[j++] = array[i]; } i++; } new_array[j] = '\0'; printf("处理后的数组内容:%s\n", new_array); return 0; }
注意:把
array[i]转成unsigned char是为了避免字符值为负数时(比如某些扩展ASCII字符),ispunct()出现未定义行为,这是个好习惯。
额外注意事项
fgets()会把输入末尾的换行符\n也读进数组,如果不需要换行符,可以在处理前或处理时把它移除(比如判断到\n时跳过,或者复制后手动把最后一个\n换成\0)。- 确保新数组的大小足够:因为原数组最多有
SIZE-1个有效字符(fgets会留一个位置给\0),所以用和原数组一样大小的new_array绝对不会越界。
内容的提问来源于stack exchange,提问作者D. Grayson
相关产品推荐
相关产品推荐

