C语言打印二维随机数组时将数值替换为指定字符输出
问题说明
需要生成元素取值为0、1、2的随机二维数组,在不修改数组内原始存储数值的前提下,仅在打印环节将数值替换为指定字符输出(如数值1对应字符'B')。现有代码运行异常,替换打印逻辑下所有输出均为'B'。
错误原因
- 代码重复定义了同名函数
print_array,C语言不允许同签名函数重复定义,冗余的旧打印函数会引发编译冲突。 - 条件判断处语法错误:将相等比较运算符
==误写为赋值运算符=。例如if (a[i][j] = 0)会先把数组元素赋值为0,再判断表达式结果(0为假,不进入该分支);后续else if(a[i][j] = 1)会把数组元素赋值为1,表达式结果为真,永远进入该分支打印'B',同时还会非法修改原数组的数值。 - 函数前置声明与实际实现不匹配:开头声明的
void print_array();为无参声明,和实际需要传入二维数组、行列数的函数签名不一致,会引发编译异常。
修复方法
- 删除冗余的重复
print_array实现,修正前置函数声明为正确签名。 - 将条件判断中的赋值运算符
=全部替换为相等比较运算符==,判断过程仅读取数组元素值,不会修改原数组存储的原始数值。 - 可简化映射逻辑:由于'A'、'B'、'C'的ASCII码连续,直接通过
'A' + a[i][j]即可得到对应字符,无需编写多分支判断。
修复后完整可运行代码
#include <stdio.h> #include <stdlib.h> #include <time.h> #define N 5 #define M 5 // 修正函数前置声明,匹配实际参数列表 void print_array(int a[][N], int m, int n); int main(void) { int i, j; int a[M][N]; srand(time(NULL)); // 初始化随机数生成器 // 为二维数组赋值0-2的随机整数 for (i = 0; i < M; i++) { for (j = 0; j < N; j++) { a[i][j] = rand() % 3; } } print_array(a, M, N); return 0; } void print_array(int a[][N], int m, int n) { int i, j; printf("列号: "); for (j = 0; j < n; j++) { printf("%d ", j + 1); } printf("\n\n"); for (i = 0; i < m; i++) { printf("行%d: ", i + 1); for (j = 0; j < n; j++) { // 仅做值读取,不修改原数组元素 // 利用ASCII码偏移直接映射对应字符 printf("%c ", 'A' + a[i][j]); } printf("\n"); } }
内容的提问来源于stack exchange,提问作者ZuCh
相关产品推荐
相关产品推荐

