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

如何复用单个char数组实现带条件的数组元素复制与转换?

单空数组复用处理字符数组转换的问题

我有三个char数组,内部存储字符或整数,需要将每个数组元素复制到一个空数组,满足以下规则:

  • 阿拉伯数字原样复制;
  • 非阿拉伯数字转换为字符'0';
  • 保留'\0'以终止数组,确保能用%s正常打印。

例如数组:

char array1[6] = {'H', '4', '1', '1', 'o', '\0'};

转换后输出04110。

我已实现copy_only_digits函数,使用多个空数组分别存储结果时可正常输出,但希望复用单个空数组处理三个数组的转换。尝试通过循环将空数组元素设为'\0'的清空方法未成功,求实现单空数组复用的方案。

失败代码

#include <stdio.h>

void copy_only_digits(char v[], char w[], int size);

int main(void)
{
        int i, size;
        size = 30;
        char array1[6] = {'H', '4', '1', '1', 'o', '\0'};
        char array2[6] = {44, 49, 65, 86, 121, '\0'};
        char array3[12] = {'I', 'n', 'f', 'o', 'r', 'm', 'a', 't', 'i', 'k', '1', '\0'};
        char empty_array[15];
        
        
        copy_only_digits(array1, empty_array, size);
        printf("%s\n", empty_array);

        for (i = 0; i < size; ++i) {
                empty_array[i] = '\0';
        }

        copy_only_digits(array2, empty_array, size);
        printf("%s\n", empty_array);

        for (i = 0; i < size; ++i) {
                empty_array[i] = '\0';
        }

        copy_only_digits(array3, empty_array, size);
        printf("%s\n", empty_array);

        return 0;
}

void copy_only_digits(char v[], char w[], int size)
{
        int i;
        for (i = 0; i < size; ++i) {
                if ((v[i] >= '0' && v[i] <= '9') || v[i] == '\0') {
                        w[i] = v[i];
                } else {
                        w[i] = '0';
                }
        }
}

可正常运行的代码(多数组存储)

#include <stdio.h>

void copy_only_digits(char v[], char w[], int size);

int main(void)
{
        int i, size;
        size = 30;
        char array1[6] = {'H', '4', '1', '1', 'o', '\0'};
        char array2[6] = {44, 49, 65, 86, 121, '\0'};
        char array3[12] = {'I', 'n', 'f', 'o', 'r', 'm', 'a', 't', 'i', 'k', '1', '\0'};
        char empty_array[size];


        copy_only_digits(array1, empty_array, sizeof(array1));
        printf("%s\n", empty_array);

        copy_only_digits(array2, empty_array, sizeof(array2));
        printf("%s\n", empty_array);

        copy_only_digits(array3, empty_array, sizeof(array3));
        printf("%s\n", empty_array);
        return 0;
}

void copy_only_digits(char v[], char w[], int size)
{
        int i;
        for (i = 0; i < size; ++i) {
                if ((v[i] >= '0' && v[i] <= '9') || v[i] == '\0') {
                        w[i] = v[i];
                } else {
                        w[i] = '0';
                }
        }
}

问题分析与修复方案

你的失败代码核心问题有两点:

  1. 调用copy_only_digits时传入的size=30,但empty_array长度仅为15,导致数组越界访问,破坏内存数据;
  2. 遍历长度超过原数组有效范围,后续未覆盖的位置残留脏数据,即便手动清空也会因越界操作引发异常。

以下是复用单个空数组的正确实现:

#include <stdio.h>

void copy_only_digits(char v[], char w[]);

int main(void)
{
        char array1[6] = {'H', '4', '1', '1', 'o', '\0'};
        char array2[6] = {44, 49, 65, 86, 121, '\0'};
        char array3[12] = {'I', 'n', 'f', 'o', 'r', 'm', 'a', 't', 'i', 'k', '1', '\0'};
        char empty_array[15]; // 确保长度足够容纳最长转换结果
        
        copy_only_digits(array1, empty_array);
        printf("%s\n", empty_array);

        copy_only_digits(array2, empty_array);
        printf("%s\n", empty_array);

        copy_only_digits(array3, empty_array);
        printf("%s\n", empty_array);

        return 0;
}

void copy_only_digits(char v[], char w[])
{
        int i = 0;
        // 仅处理原数组的有效元素(到'\0'为止)
        while (v[i] != '\0') {
                if (v[i] >= '0' && v[i] <= '9') {
                        w[i] = v[i];
                } else {
                        w[i] = '0';
                }
                i++;
        }
        // 强制添加终止符,截断之前的残留数据
        w[i] = '\0';
}

关键修复点

  • 重构copy_only_digits函数,不再依赖传入的size,通过遍历到v[i] == '\0'处理有效元素,彻底避免越界;
  • 每次处理后自动在目标数组末尾添加'\0',无需手动清空整个数组——后续处理会覆盖原有效位置的内容,终止符会自动截断之前的数据;
  • 确保empty_array的长度足够容纳最长的转换结果(此处最长转换结果为11个字符加1个终止符,15的长度完全足够)。

内容的提问来源于stack exchange,提问作者user22701105

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 07:10:07