我正在为vigener密码构建一个表格recta表,出于某种原因,它在第一个循环之后打印'@',而不是'a'。这是我的代码:

#include <stdio.h>

int
main (void)
{
    char alph[26] = "abcdefghijklmnopqrstuvwxyz";
    char tRecta[26][26] = {0};  //Tabular Recta

    int i,k,j = 0;
    for(i=0;i<26; i++) { //Build tabular recta
        for(k=0; k<26; k++) {
            if((j+k) > 26) {
                tRecta[i][k] = alph[(j+k)-26];
            } else {
                tRecta[i][k] = alph[(j+k)];
            }
        }
        j++;
    }

    for(i=0;i<26;i++) {
        for(k=0;k<26;k++) {
            printf("%c",tRecta[i][k]);
        }
        printf("\n");
    }
    return 0;
}

这就是我得到的:
abcdefghijklmnopqrstuvwxyz
bcdefghijklmnopqrstuvwxyz@
cdefghijklmnopqrstuvwxyz@b
defghijklmnopqrstuvwxyz@bc
efghijklmnopqrstuvwxyz@bcd
fghijklmnopqrstuvwxyz@bcde
ghijklmnopqrstuvwxyz@bcdef
hijklmnopqrstuvwxyz@bcdefg
ijklmnopqrstuvwxyz@bcdefgh
jklmnopqrstuvwxyz@bcdefghi
klmnopqrstuvwxyz@bcdefghij
lmnopqrstuvwxyz@bcdefghijk
mnopqrstuvwxyz@bcdefghijkl
nopqrstuvwxyz@bcdefghijklm
opqrstuvwxyz@bcdefghijklmn
pqrstuvwxyz@bcdefghijklmno
qrstuvwxyz@bcdefghijklmnop
rstuvwxyz@bcdefghijklmnopq
stuvwxyz@bcdefghijklmnopqr
tuvwxyz@bcdefghijklmnopqrs
uvwxyz@bcdefghijklmnopqrst
vwxyz@bcdefghijklmnopqrstu
wxyz@bcdefghijklmnopqrstuv
xyz@bcdefghijklmnopqrstuvw
yz@bcdefghijklmnopqrstuvwx
z@bcdefghijklmnopqrstuvwxy

我以前很少使用C,是不是printf("%c",tRecta[i][k]);没有做我认为它在做的事情?

最佳答案

对数组的访问超出了界限。将if((j+k) > 26)更改为if((j+k) >= 26),因为数组alph的最后一个有效索引是25而不是26。另一种解决方案是使用%操作:

#define ARR_SIZE 26

int i,k,j = 0;
for( i=0; i<ARR_SIZE; i++ ) { //Build tabular recta
    for( k=0; k<ARR_SIZE; k++ ) {
        tRecta[i][k] = alph[ (j+k) % ARR_SIZE ];
    }
    j++;
}

请注意,您阅读了alph[26]。这是未定义的行为。

关于c - 表格Recta表无法正确生成,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35161528/

10-12 16:13