Как свапнуть строки в си?

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

1. Использование временной переменной:

#include <stdio.h>
#include <string.h>

void swapStrings(char **str1, char **str2) {
    char *temp = *str1;
    *str1 = *str2;
    *str2 = temp;
}

int main() {
    char *str1 = "Hello";
    char *str2 = "World";
    
    printf("Before swap:n");
    printf("str1: %sn", str1);
    printf("str2: %sn", str2);
    
    swapStrings(&str1, &str2);
    
    printf("After swap:n");
    printf("str1: %sn", str1);
    printf("str2: %sn", str2);
    
    return 0;
}

В этом примере используется переменная temp для временного хранения адреса первой строки, затем адрес первой строки изменяется на адрес второй строки, а адрес второй строки изменяется на адрес, хранящийся в переменной temp. В результате строки меняются местами.

2. Использование указателей:

#include <stdio.h>
#include <string.h>

void swapStrings(char **str1, char **str2) {
    char *temp;
    temp = *str1;
    *str1 = *str2;
    *str2 = temp;
}

int main() {
    char *str1 = "Hello";
    char *str2 = "World";
    
    printf("Before swap:n");
    printf("str1: %sn", str1);
    printf("str2: %sn", str2);
    
    swapStrings(&str1, &str2);
    
    printf("After swap:n");
    printf("str1: %sn", str1);
    printf("str2: %sn", str2);
    
    return 0;
}

В этом примере указатели **str1 и **str2 передаются в функцию swapStrings. После обмена значениями указателей адреса строк меняются местами.

3. Использование массивов символов:

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

void swapStrings(char *str1, char *str2) {
    int len1 = strlen(str1);
    int len2 = strlen(str2);
  
    char *temp = (char*)malloc((len1 + 1) * sizeof(char));
    strcpy(temp, str1);
    strcpy(str1, str2);
    strcpy(str2, temp);
  
    free(temp);
}

int main() {
    char str1[] = "Hello";
    char str2[] = "World";
    
    printf("Before swap:n");
    printf("str1: %sn", str1);
    printf("str2: %sn", str2);
    
    swapStrings(str1, str2);
    
    printf("After swap:n");
    printf("str1: %sn", str1);
    printf("str2: %sn", str2);
    
    return 0;
}

В этом примере использованы массивы символов для хранения строк. С помощью функции malloc() выделяется память под временную строку temp, затем используется функция strcpy() для копирования содержимого str1 в temp, str2 в str1, а содержимое temp в str2. И, наконец, освобождается выделенная память.

4. Использование операций XOR:

#include <stdio.h>
#include <string.h>

void swapStrings(char *str1, char *str2) {
    int len1 = strlen(str1);
    int len2 = strlen(str2);

    for (int i = 0; i < len1 && i < len2; i++) {
        str1[i] ^= str2[i];
        str2[i] ^= str1[i];
        str1[i] ^= str2[i];
    }

    if (len1 < len2) {
        for (int i = len1; i < len2; i++)
            str1[i] = str2[i];
    } else {
        for (int i = len2; i < len1; i++)
            str2[i] = str1[i];
    }
}

int main() {
    char str1[] = "Hello";
    char str2[] = "World";
    
    printf("Before swap:n");
    printf("str1: %sn", str1);
    printf("str2: %sn", str2);
    
    swapStrings(str1, str2);
    
    printf("After swap:n");
    printf("str1: %sn", str1);
    printf("str2: %sn", str2);
    
    return 0;
}

В этом примере используется операция XOR (^) для обмена каждого символа между двумя строками. Если одна из строк длиннее другой, то копируются оставшиеся символы из более длинной строки.

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