我正在为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/