如何复用单个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'; } } }
问题分析与修复方案
你的失败代码核心问题有两点:
- 调用
copy_only_digits时传入的size=30,但empty_array长度仅为15,导致数组越界访问,破坏内存数据; - 遍历长度超过原数组有效范围,后续未覆盖的位置残留脏数据,即便手动清空也会因越界操作引发异常。
以下是复用单个空数组的正确实现:
#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
相关产品推荐
相关产品推荐

