我正在尝试编写playfair密码测试代码,我想将字母排列成矩阵格式,从左上角到右下角对角填充矩阵。 (我在逻辑上考虑数组的[0][0]
索引对应于矩阵的最左上角。
以下是代码:
#include <stdio.h>
#include <string.h>
char key[5][5];
void gen_key(char* key_string)
{
int i,j,k,p=0;
if(strlen(key_string)<24)
{
printf("key too short\n");
exit(-1);
}
for(i=0;i<5;i++)
{
for(j=0,k=i;j<5,k>-1;k--,j++)
{
key[k][j]=key_string[p++];
}
}
for(j=1;j<5;j++)
{
printf("j=%d\n",j);
for(k=j,i=4;k<5,i>0;i--,k++)
{
printf("placing %c at %d %d\n",key_string[p],i,k);
key[i][k]=key_string[p++];
}
}
}
void print_key()
{
int i,j;
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
printf("%c ",key[i][j]);
}
printf("\n");
}
}
int main()
{
gen_key("LQGUMDXRHBZVNEAYSICWOFTKP");
print_key();
return 0;
}
它给出的测试输出是:
j=1
placing Y at 4 1
placing S at 3 2
placing I at 2 3
placing C at 1 4
j=2
placing W at 4 2
placing O at 3 3
placing F at 2 4
placing T at 1 5
j=3
placing K at 4 3
placing P at 3 4
placing at 2 5
placing at 1 6
j=4
placing at 4 4
placing at 3 5
placing at 2 6
placing ; at 1 7
L G D B A
Q M H E C
T ; I F
S O P
Y W K
我不明白为什么将T at 1 5
放在我提到的第二个for
循环中k<5
的值。
答案 0 :(得分:7)
如果你想要两个条件都是真的
j<5,k>-1
使用&amp;&amp;运算符,而不是逗号
j<5 && k>-1
在以逗号分隔的列表中,逗号只生成最后一个值,因此在您的代码中,您实际上只使用了第二个条件k>-1
。
答案 1 :(得分:3)
逗号也是C中的运算符,但它没有按照您的想法执行。 :)
for(j=0, k=i; j<5 && k>-1; k--, j++)
就是您所需要的。