printf()打印整个char矩阵

时间:2015-02-10 12:11:23

标签: c matrix char printf

如代码中所标记的,第一个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] = '\0';
        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] = '\0';
        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);
}

2 个答案:

答案 0 :(得分:3)

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

char m_cfr[row][5];

在您访问时

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

你正面临off-by-one error。超出内存的访问会导致undefined behaviour

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

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

答案 1 :(得分:0)

%s需要char*并打印所有内容,直到遇到\0。所以,

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] = '\0';

m[i][5] = '\0';

错了。

要修复前一个问题,请使用

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}};