for循环超过其限制

tig*_*den 0 c for-loop

我正在尝试编写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;
}
Run Code Online (Sandbox Code Playgroud)

它给出的测试输出是:

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  
Run Code Online (Sandbox Code Playgroud)

我不明白为什么它放在T at 1 5我提到的第二个for循环中的值k<5.

fed*_*024 7

如果你想要两个条件都是真的

j<5,k>-1
Run Code Online (Sandbox Code Playgroud)

使用&&运算符,而不是逗号

j<5 && k>-1
Run Code Online (Sandbox Code Playgroud)

在以逗号分隔的列表中,逗号仅生成最后一个值,因此在您的代码中,您实际上只使用第二个条件k>-1.