我有一个2D字符数组,我想交换这个数组的两行。 我能想到这个功能。
char str[5][5];
swap(str[i],str[j]);
void swap(char * p, char *q) {
char *temp;
temp = p;
p = q;
q = temp;
}
此功能不起作用。 我也想出了这个,
char ** temp1;
char ** temp2;
temp1 = &str[i];
temp2 = &str[j];
*temp1 = str[j];
*temp2 = str[i];
这也不起作用,请告诉我一个正确的方法来完成这项任务。
答案 0 :(得分:1)
尝试以下方法
#include <stdio.h>
#include <string.h>
void swap( char *s1, char *s2, size_t n )
{
char t[n];
strcpy( t, s1 );
strcpy( s1, s2 );
strcpy( s2, t );
}
#define N 5
int main(void)
{
char s[N][N] =
{
"Cat",
"Dog",
"Cow",
"Bird",
"Goat"
};
for ( size_t i = 0; i < N; i++ ) puts( s[i] );
puts( "" );
swap( s[0], s[3], N );
for ( size_t i = 0; i < N; i++ ) puts( s[i] );
return 0;
}
程序输出
Cat
Dog
Cow
Bird
Goat
Bird
Dog
Cow
Cat
Goat
考虑到您也可以使用标准功能strncpy
代替strcpy
。
另一种方法是使用标准函数memcpy
来复制N个字符。
答案 1 :(得分:0)
void swap( char * ary, int idx1, int idx2, int rowlen )
{
for ( int x=0; x<rowlen; x++ )
{
temp = ary[idx1][x];
ary[idx1][x] = ary[idx2][x];
ary[idx2][x] = temp;
}
}
#define ROWLEN 5
void main( void )
{
char str[5][ROWLEN];
swap( str, 2, 4, ROWLEN ); // swap rows 2 and 4
}
我没有编译它,因此可能存在语法错误,但这应该传达这个想法。
答案 2 :(得分:0)
使用循环交换两行的每个元素:
void swapRows(char* row1, char* row2, size_t rowlen)
{
for (size_t i=0; i<rowlen; ++i)
{
char tmp = row1[i];
row1[i] = row2[i];
row2[i] = tmp;
}
}
这里我们有一个函数,它指向数组的两行,一行的长度,并运行一个非常简单的循环来交换这些行的每个元素。以下是您将如何使用它:
int main()
{
char str[2][2] = {{'1','2'},{'3','4'}};
swapRows(&str[0][0], &str[1][0], 2);
// str now contains {'3','4'},{'2','1'}
}
您似乎尝试过将指针交换到行而不是物理移动行的内容。那不行。指针只允许您查找数据,但移动它们实际上并不会修改该数据。现在,如果你有一个char**
数组,这个想法会起作用,但是对于一个连续的2D char[][]
数组,你必须在物理上移动它。
答案 3 :(得分:0)