You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从已读取的字符数组中移除标点并创建新数组?

移除字符数组中的标点符号,生成新数组的几种实现方式

嘿,这个需求其实挺常见的,我来给你分享几个实用的实现思路,都是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()出现未定义行为,这是个好习惯。

额外注意事项

  1. fgets()会把输入末尾的换行符\n也读进数组,如果不需要换行符,可以在处理前或处理时把它移除(比如判断到\n时跳过,或者复制后手动把最后一个\n换成\0)。
  2. 确保新数组的大小足够:因为原数组最多有SIZE-1个有效字符(fgets会留一个位置给\0),所以用和原数组一样大小的new_array绝对不会越界。

内容的提问来源于stack exchange,提问作者D. Grayson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:58:54