在C中交换两行二维字符数组

时间:2015-03-02 20:25:31

标签: c arrays char swap

我有一个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];

这也不起作用,请告诉我一个正确的方法来完成这项任务。

4 个答案:

答案 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)

由于这是一个连续的2D数组,而不是一个指针数组,因此应该使用memcpy复制五元素子数组,如下所示:

void swap(char *p, char *q) {
    char temp[5];
    memcpy(temp, p, sizeof(temp));
    memcpy(p, q, sizeof(temp));
    memcpy(q, temp, sizeof(temp));
}

我们的想法是创建一个足以容纳一个“行”的数组缓冲区,将第一行复制到其中,然后以通常的方式进行交换(即分配一个临时变量)。

Demo.