Как получить правильный вывод, когда я переворачиваю строку в C, используя указатели - PullRequest
1 голос
/ 30 января 2020

Я пытаюсь перевернуть строку в C с помощью указателей, но вывод действительно странный. Логика c кажется хорошей, но я не уверен, почему она выводится так. Вот код:

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

int main()
{
    char str[20], reverse_str[20], *pointer;
    int i = 0;

    printf("%s", "Enter any string: ");
    scanf("%s", str);
    pointer = str;

    int string_length = strlen(pointer);

    //int count = 0;
    for (int i = string_length; i > 0; i--){
        reverse_str[i -1] = *pointer;
        pointer++;
    }
    printf("%d\n", string_length);
    printf("Original string = %s\n", str);
    printf("Reversed string = %s\n", reverse_str);

}

Вывод выглядит так:

Enter any string: Hello

Original string = Hello
Reversed string = olleH╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠Hello

Ответы [ 2 ]

4 голосов
/ 30 января 2020

Это когда появляется роль нулевого терминатора, который часто игнорируется новичками как глупый бит информации.

В C каждая строка заканчивается нулевым символом, потому что должен быть некоторый способ узнать, когда конкретная строка заканчивается, начиная с ее начального расположения в памяти. Если вы правильно инициализируете строку или вводите \0 соответствующим образом, строка может отображаться как есть. В противном случае каждый символ в памяти, начиная с нулевого индекса строки, будет отображаться, пока не встретит нулевой символ. Вот как работает printf("%s", str), простыми словами.

По этой причине вы получаете этот странный вывод. Это объясняет это гораздо лучше.

Решение:

Добавьте reverse_str[string_length] = '\0'; после того, как вы перевернули строку, используя это для l oop, поэтому что ваша результирующая строка правильно завершена нулем.

Бонус:

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

1 голос
/ 30 января 2020

Чтобы напечатать строку, ей нужен NUL-терминатор \0, но reverse_str не имеет его.

Вам необходимо установить \0 в конце revers_str, например:

reverse_str[string_length] = '\0';

, чтобы печатать правильный вывод.

...