Почему код не переворачивает строки? - PullRequest
0 голосов
/ 15 июня 2019

Проблема состоит в том, чтобы обратить все строки в массиве указателей на строки. Я написал следующий код для того же. После показа введенных строк код не может перевернуть строки. Я попытался изменить указатели символов el и el2 на символы, но безрезультатно. Пожалуйста, помогите мне с этим.

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

int main() {
    int x, i, length, len, j;
    printf("How many strings you want to enter:\n");
    scanf("%d", &x);
    char *strings[x], string[50], *p, *t, *el, *el2;
    for (i = 0; i < x; i++) {
        scanf(" %49[^\n]", string);
        length = strlen(string);
        p = (char *)malloc(length + 1);
        strcpy(p, string);
        strings[i] = p;
    }
    printf("Entered strings are:\n");
    for (i = 0; i < x; i++) {
        printf("%s\n", strings[i]);
    }
    printf("Reversed strings :\n");
    for (i = 0; i < x; i++) {
        len = strlen(strings[i]);
        for (j = 0; j <= (len - 2) / 2; j++) {
            el = (strings[i] + j);
            el2 = (strings[i] + (len - j - 1));
            t = el2;
            el2 = el;
            el = t;
        }
    }
    for (i = 0; i < x; i++) {
        printf("%s\n", strings[i]);
    }
    return 0;
}

Ответы [ 3 ]

1 голос
/ 15 июня 2019

Ты ничего не меняешь. Я бы рекомендовал использовать функцию подкачки:

void swap(char *a, char *b)
{
    char tmp = *a;
    *a = *b;
    *b = tmp;
}

А затем во внутреннем цикле:

for(j=0;j<=(len-2)/2;j++)
{
    swap(strings[i] + j, strings[i]+(len -j-1));
}
1 голос
/ 15 июня 2019

Выполнение перестановки строк в вашей функции main() громоздко и подвержено ошибкам.Вместо этого вы должны написать простую функцию и использовать ее:

Вот исправленная и упрощенная версия:

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

char *str_reverse(char *s) {
    for (size_t i = 0, j = strlen(s); i < j--; i++) {
        char t = s[i];
        s[i] = s[j];
        s[j] = t;
    }
    return s;
}

int main() {
    int x, i;

    printf("How many strings you want to enter:\n");
    if (scanf("%d", &x) != 1 || x <= 0 || x > 1000) {
        printf("Invalid number: %d\n", x);
        return 1;
    }

    char *strings[x], string[50];

    for (i = 0; i < x; i++) {
        if (scanf(" %49[^\n]", string) != 1) {
            printf("Premature end of file\n");
            return 1;
        }
        // use strdup to allocate string copies.
        // strdup is a Posix standard function
        // if your system does not have it, it is easy to implement.
        strings[i] = strdup(string);
    }
    printf("Entered strings are:\n");
    for (i = 0; i < x; i++) {
        printf("%s\n", strings[i]);
    }
    // Reverse strings
    for (i = 0; i < x; i++) {
        str_reverse(strings[i]);
    }
    printf("Reversed strings:\n");
    for (i = 0; i < x; i++) {
        printf("%s\n", strings[i]);
    }
    return 0;
}
1 голос
/ 15 июня 2019

Вы меняете локальные переменные-указатели, что бессмысленно.

Вам необходимо поменять char s, на которые указывают указатели:

    for(j=0;j<=(len-2)/2;j++)
    {
        char t, *el, *el2;
        el = (strings[i] + j);
        el2 = (strings[i]+(len -j-1));
        t = *el2;
        *el2 = *el;
        *el = t;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...