我将一个二维数组传递给一个函数来打印输出,但我得到的输出是错误的
功能
void PrintArray(unsigned char mat[][4]){
int i, j;
printf("\n");
for(i = 0;i<4;i++){
for(j = 0;j<4;j++)
printf("%3x",mat[i][j]);
printf("\n");
}
printf("\n");
}
主要功能
int main(){
int i,j;
//static int c=175;
unsigned char state[4][4], key[4][4], expandedKey[176];
printf("enter the value to be decrypted");
for(i=0;i<4;i++)
for(j=0;j<4;j++)
scanf("%x",(unsigned int *)&state[j][i]);
PrintArray(state);
return 0;
}
预期产出
1 5 9 c
2 6 0 d
3 7 a e
4 8 b f
实际输出
h2o@h2o-Vostro-1015:~$ ./a.out enter the value to be decrypted 1 2 3 4 5 6 7 8 9 0 a b c d e f
1 5 9 c
0 0 0 d
0 0 0 e
0 0 0 f
我检查了传递2d数组的方法,我认为这是正确的,但不确定为什么得到这个输出,请提示......
答案 0 :(得分:6)
我要走出去,说你的问题就在这里:
scanf("%x",(unsigned int *)&state[j][i]);
state[i][j]
的大小只能容纳一个char
,但您告诉scanf
将其视为指向unsigned int
的指针;这可能意味着scanf
会覆盖相邻的数组元素,因为sizeof (unsigned int)
很可能大于sizeof (char)
。
将char
和unsigned int
中的数组声明从main
更改为PrintArray
,并在scanf
中丢失演员表。
答案 1 :(得分:4)
数组传递正确。但是,由于变量类型%x,scanf函数似乎会将某些值覆盖为0。
%x指定的数据类型是&#34; int&#34;因为%x与%d相似(输入为十六进制除外)。数据占用4个字节(通常)。因此,当用户输入一个数字,例如1时,四个字节01 00 00 00(假设Intel机器上的小端字节)将被写入内存而不是1.尾随的0将删除存储在内存中的一些现有元素。字节数组,因为在字节数组中,每个元素只分配1个字节。
请尝试以下代码:
int main() {
int i,j;
//static int c=175;
unsigned char state[4][4], key[4][4], expandedKey[176];
printf("enter the value to be decrypted");
int tmp;
for(i=0;i<4;i++)
for(j=0;j<4;j++) {
scanf("%x", &tmp);
state[j][i] = (char)tmp;
}
PrintArray(state);