2015-03-02 3 views
-1

У меня есть двумерный массив символов, я хочу поменять две строки этого массива. Я могу думать об этой функции.Преобразование двух строк 2-мерного массива символов в C

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

Отправляйте длину функции 'swap' и добавьте в нее цикл, поменяв каждый элемент. –

ответ

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 
} 

Я не скомпилировал это, чтобы могли быть синтаксические ошибки, но это должно передать идею.

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[][] вы должны физически перемещать вещи.

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.

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 символов.

Смежные вопросы