Как я могу заставить строковый массив обмениваться его компонентами с помощью функции подкачки? - PullRequest
0 голосов
/ 05 февраля 2019

Проблема в том, что этот код не заменит эти две строки.Я новичок в программировании, но я могу сказать, что проблема в том, что функция подкачки, но я не знаю, как это исправить.

Я пытался добавить strcpy вместо "=" в своп, но это не такт работал.

#include <stdio.h>
#include <stdlib.h>

void swap(char *t1, char *t2) {
    char *t;
    t=t1;
    t1=t2;
    t2=t;
}
int main() {
    char *s[2] = {"Hello", "World"};
    swap(s[0], s[1]);
    printf("%s\n%s", s[0], s[1]);
    return 0;
}

Ответы [ 3 ]

0 голосов
/ 05 февраля 2019

Тщательно проверяйте типы.

То, что вы получаете как члены массива, является указателями (на начальный элемент строковых литералов).Вы должны поменять местами элементы таким образом, чтобы они указывали на другой строковый литерал.Итак, вам нужно изменить сами указатели.

Итак, вам нужно передать указатель на эти указатели, а затем внести изменения из вызываемой функции.

Сделайте что-то вроде

swap(&(s[0]), &(s[1]));

и затем в вызываемой функции:

void ptrSwap(char **t1, char **t2) {
    char *temp;
    temp=*t1;
    *t1=*t2;
    *t2=temp;
}

Бонусные баллы: Назовите свои функции (и переменные тоже, где это применимо) осмысленно.

0 голосов
/ 05 февраля 2019

Вам необходимо передать указатель указателя, то есть адрес позиции в массиве, где присутствуют строки, чтобы вы могли поменять и разместить правильные адреса там.

Попробуйте следующий код:

#include <stdio.h>
#include <stdlib.h>

void swap(char **t1, char **t2) {
    char *t;
    t=*t1;
    *t1=*t2;
    *t2=t;
}
int main() {
    char *s[2] = {"Hello", "World"};
    swap(&s[0], &s[1]);
    printf("%s\n%s", s[0], s[1]);
    return 0;
}

Выход:

World
Hello
0 голосов
/ 05 февраля 2019

Вы хотите использовать параметры здесь, и поскольку ваши строки представлены в виде указателей, вам нужны указатели на указатели:

void swap(char **t1, char **t2) {
    char *t;
    t = *t1;
    *t1 = *t2;
    *t2 = t;
}

Назовите это так:

swap(&s[0], &s[1]);

Я пытался добавить strcpy вместо «=» в swap, но это не сработало.

Причина, по которой это не работает, заключается в том, что строки на самом деле хранятся вдвоичный файл программы и, следовательно, не может быть изменен, и с strcpy вы будете писать поверх них.Если вместо этого вы скопируете их в стек или кучу, вы можете выполнить обмен с помощью strcpy.Конечно, это будет менее эффективно, чем просто замена указателей, но это будет выглядеть так:

void swap(char *t1, char *t2) {
    char buf[16]; // needs to be big enough to fit the string
    strcpy(buf, t1);
    strcpy(t1, t2);
    strcpy(t2, buf);
}

Также вам нужно изменить определение s на что-то похожее на

char s[2][16] = { "Hello", "World" }; // strings are copied to the stack now
...