printf() 打印整个字符矩阵

printf() prints whole char matrix

如代码中所示,第一个 printf() 正确地仅打印矩阵的第 i 行。但是在循环之外,printf()strcat() 都作为单行字符串作用于从第 i 行开始的整个矩阵。这意味着

printf("%s\n",m_cfr[0])

将打印整个矩阵,但 m_cfr[i] 将从第 i 行开始打印整个矩阵。 char* string 是没有空格的单行字符串。

trasp(char* string)
{
    int row = strlen(string) / 5;
    char m[row][5];
    char m_cfr[row][5];
    char cfr[row*5];

    memset(cfr, 0, row * 5);

    int key[5] = {3, 1, 2, 0, 4};
    int k      = 0;

    for (i = 0 ; i < row ; i++)
    {
        strncpy(m[i], string + k, 5);

        m[i][5] = '[=11=]';
        k      += 5;    
    }

    for (i = 0 ; i < row ; i++)
    {
        for (j = 0 ; j < 5 ; j++)
        {
            m_cfr[i][key[j]] = m[i][j];
        }
        m_cfr[i][5] = '[=11=]';
        printf("%s\n", m_cfr[i]);  //--->prints only line i
    }    
    printf("%s\n", m_cfr[0]); //prints whole matrix    
    strcat(cfr, m_cfr[0]);   //concatenates whole matrix       
    printf("%s\n", cfr);
}

在你的代码中,你的数组定义是

char m_cfr[row][5];

您正在访问

 m_cfr[i][5] = '[=11=]';
 /*       ^
          | 
          there is no 6th element
 */

你面对的是off-by-one error. Out-of-bound memory access causes undefined behaviour

也许您想将空终止语句更改为

m_cfr[i][4] = '[=12=]'; //last one is null

%s 期望 char* 并打印所有内容,直到遇到 [=18=]。所以,

printf("%s\n", m_cfr[i]);
printf("%s\n",m_cfr[0]);
strcat(cfr,m_cfr[0]);

所有表现出未定义的行为,因为 m_cfr[i]m_cfr[0]m_cfr[0]char 而不是 char*%s因为 strcat 的两个参数都期望 char*。另外,作为 SouravGhosh points out,使用

m_cfr[i][5] = '[=11=]';

m[i][5] = '[=12=]';

错了。

要解决前一个问题,请使用

printf("%s\n", &m_cfr[i]);
printf("%s\n",m_cfr);
strcat(cfr,&m_cfr[0]);

要打印整个字符串并连接 strcat 参数中的两个字符串,或者如果您只想打印 chars,请使用

printf("%c\n", m_cfr[i]);
printf("%c\n",m_cfr[0]);

至于后一个问题,使用

char m[row][5]={{0}};
char m_cfr[row][5]={{0}};