繁体   English   中英

C语言中的二维数组

[英]2 dimensional array in C language

我将2d数组传递给函数以打印输出,但是我得到的输出是错误的


功能

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数组的方法,我认为它是正确的,但是不确定为什么要获得此输出,请告知...

我要弯腰说你的问题就在这里:

scanf("%x",(unsigned int *)&state[j][i]);

state[i][j]的大小可容纳单个char ,但是您要告诉scanf将其视为指向unsigned int的指针; 这很可能意味着scanf正在覆盖相邻的数组元素,因为sizeof (unsigned int)最有可能大于sizeof (char)

mainPrintArray中将数组的声明从char更改为unsigned int ,并在scanf丢失PrintArray

数组传递正确。 但是,由于变量类型%x,scanf函数似乎将某些值覆盖为0。

%x指定的数据类型为“ int”,因为%x类似于%d(输入为十六进制除外)。 数据占用4个字节(通常)。 因此,当用户输入数字(例如1)时,会将四个字节0​​1 00 00 00(假设在Intel计算机上为little-endianness)写入内存,而不是写入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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM