C语言两数组匹配替换问题:将匹配元素替换为'X'并正确输出
C语言数组对比替换与输出修正
编写了下述C语言代码,需求为:对比pirolito数组与retardado数组,当pirolito数组中的元素与retardado数组内任意元素相等时,将pirolito数组对应位置的元素替换为字符'X',并按如下示例格式输出两个数组:
示例输入数组:
pirolito[3, 6, 8, 9, 7, 3, 6, 1, 0, 4]
retardado[3, 17, 12, 18, 11, 16, 6, 10, 0, 15]
预期输出:
[X, 6, 8, 9, 7, 3, X, 1, X, 4]
[3, 17, 12, 18, 11, 16, 6, 10, 0, 15]
但当前编译运行后无报错,却未实现元素替换效果,也无法输出预期格式的数组,请问该如何修改代码以实现需求?
原始代码
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <stdbool.h> #define BTT 10 void create_pirolito(int list[BTT]); void create_retardado(int list[BTT]); void compare_lists(int list1[BTT], int list2[BTT]); void prints_both(int list1[BTT], int list2[BTT]); void create_pirolito(int list[BTT]) { for(int i=0; i<BTT; i++) { list[i]=rand()%10; } } void create_retardado(int list[BTT]) { for(int i=0; i<BTT; i++) { list[i]=rand()%20; } } void prints_both(int list1[BTT], int list2[BTT]) { int i=0; int j=0; for(int z=0; z<BTT; z++) { printf("(%2d %2d)\n", list1[i], list2[j]); i++; j++; } } void compare_lists(int list1[BTT], int list2[BTT]) { char x='X'; for(int i=0; i<BTT; i++) { for(int j=0; j<BTT; j++) { if(list1[i]==list2[j]) { list1[i]==(int)(x); } } printf("\n"); } } int main() { int pirolito[BTT]; int retardado[BTT]; create_pirolito(pirolito); create_retardado(retardado); compare_lists(pirolito, retardado); prints_both(pirolito, retardado); return 0; }
存在的问题
- 替换操作错误:
compare_lists函数中使用了比较运算符==而非赋值运算符=,导致无法完成元素替换。 - 输出格式不匹配:
prints_both函数的输出逻辑与预期格式不符,预期是数组整体用[]包裹、元素逗号分隔,而非每行输出一对元素。 - 随机数未初始化种子:未调用
srand(time(NULL))初始化随机数生成器,每次运行生成的随机数序列完全相同。 - 替换后输出逻辑缺失:pirolito数组为int类型,替换为'X'后存储的是其ASCII值(88),直接输出数字会显示88而非字符X,需要判断输出内容。
修正后的代码
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <stdbool.h> #define BTT 10 void create_pirolito(int list[BTT]); void create_retardado(int list[BTT]); void compare_lists(int list1[BTT], int list2[BTT]); void print_array(int list[BTT], int is_pirolito); void create_pirolito(int list[BTT]) { for(int i=0; i<BTT; i++) { list[i] = rand() % 10; } } void create_retardado(int list[BTT]) { for(int i=0; i<BTT; i++) { list[i] = rand() % 20; } } // 按预期格式输出数组,is_pirolito标记是否为需要判断X的数组 void print_array(int list[BTT], int is_pirolito) { printf("["); for(int i=0; i<BTT; i++) { if(is_pirolito && list[i] == 'X') { printf("X"); } else { printf("%d", list[i]); } if(i != BTT - 1) { printf(", "); } } printf("]\n"); } void compare_lists(int list1[BTT], int list2[BTT]) { for(int i=0; i<BTT; i++) { for(int j=0; j<BTT; j++) { if(list1[i] == list2[j]) { list1[i] = 'X'; // 赋值操作,存储'X'的ASCII值 break; // 找到匹配后无需继续对比,跳出内层循环 } } } } int main() { int pirolito[BTT]; int retardado[BTT]; srand(time(NULL)); // 初始化随机数种子 create_pirolito(pirolito); create_retardado(retardado); compare_lists(pirolito, retardado); // 按预期格式输出两个数组 print_array(pirolito, 1); print_array(retardado, 0); return 0; }
关键修改说明
- 修复替换操作:将
compare_lists中的list1[i]==(int)(x);改为list1[i] = 'X';,完成赋值;同时添加break,找到匹配后立即终止内层循环,提升效率。 - 重写输出函数:新增
print_array函数,实现数组的[]包裹、逗号分隔格式输出,通过is_pirolito参数判断是否需要将ASCII值为'X'的元素输出为字符X。 - 初始化随机数种子:在
main函数开头添加srand(time(NULL));,确保每次运行生成不同的随机数序列。 - 移除无用代码:删除
compare_lists中多余的printf("\n");语句,避免无意义的空行输出。
内容的提问来源于stack exchange,提问作者David feoerwg
相关产品推荐
相关产品推荐

