数组相等性校验及整数数组替换字符'X'失败问题排查
问题排查:数组匹配替换未生效的问题
问题描述
对比两个数组,当pirolito数组中的元素与retardado数组中的元素相等时,将该位置的整数替换为字符'X'。但编译运行后无报错,仅输出大量空白后打印两个数组,对应匹配位置并未替换为'X'。
原代码
// Igualdade entre listas --> Teste 1 #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函数中,list1[i]==(int)(x);使用了比较运算符==,而非赋值运算符=,导致数组元素根本没有被修改。应改为list1[i] = (int)x;。 - 多余空白输出:
compare_lists里的printf("\n");循环执行10次,产生大量空行,直接删除即可。 - 打印格式错误:原代码用
%2d打印替换后的元素,会输出'X'的ASCII码88,而非字符'X'。需要修改prints_both函数,判断元素是否等于'X'的ASCII值,分别打印字符或数字。 - 随机数未初始化:
main函数中未调用srand(time(NULL)),每次运行的随机数序列固定,不利于测试,需添加该初始化语句。 - 冗余循环优化:当找到匹配元素后,可直接跳出内层循环,避免重复检查。
修复后的代码
// Igualdade entre listas --> Teste 1 #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]) { for(int z=0; z<BTT; z++) { // 判断是否为替换后的'X',分别打印字符或数字 if(list1[z] == (int)'X') { printf("(%2c %2d)\n", 'X', list2[z]); } else { printf("(%2d %2d)\n", list1[z], list2[z]); } } } 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; // 改为赋值运算符 break; // 找到匹配后跳出内层循环,避免重复操作 } } } } int main() { // 初始化随机数种子 srand(time(NULL)); int pirolito[BTT]; int retardado[BTT]; create_pirolito(pirolito); create_retardado(retardado); compare_lists(pirolito, retardado); prints_both(pirolito, retardado); return 0; }
内容的提问来源于stack exchange,提问作者David feoerwg
相关产品推荐
相关产品推荐

