我正在为vigenere密码构建一个tabula 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]);
没有完全按照我的想法做到吗?
答案 0 :(得分:2)
您可以访问您的阵列越界。将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]
请注意您阅读Main.aggressivePoints
。这是未定义的行为。