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}};
如代码中所示,第一个 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}};