Я также получаю нежелательный вывод - PullRequest
0 голосов
/ 06 апреля 2019

Я пытаюсь перевернуть строку с помощью функции Reverse.Если я поставлю размер выходного массива 10 и передам 10 значений, я получу идеальный вывод.Но если я инициализирую размер выходного массива с помощью str.size (), это также дает некоторое значение мусора.

#include<iostream>
#include<string>

using namespace std;

string Reverse(string str)
{
    cout<<str.size()<<endl;
    char output[str.size()];

    int temp = 0;
    for(int i = str.length()-1 ; i >= 0 ; i--)
    {
        output[temp] = str[i];
        temp++;
    }
    return output;
}

int main()
{
    char st[100];
    cout<<Reverse(gets(st));

    return 0;
}

1 Ответ

1 голос
/ 06 апреля 2019

Здесь есть несколько проблем, кроме пропавшего NULL терминатора, на который уже указывали другие:

  • Использование устаревшей и опасной функции gets.

    Функция не предоставляет средств для предотвращения переполнения буфера массива назначения, учитывая достаточно длинную входную строку. std::gets устарел в C ++ 11 и удален из C ++ 14.

    std::fgets может использоваться вместо.

  • Использование массива переменной длины (который может быть расширением компилятора) в функции Reverse, функция, которая не поддерживается стандартом C ++.

    char output[str.size()];

Поскольку вы уже используете std::string в своей программе, вы можете использовать его и для переменной output, и это решит вашу проблему с NULL завершением.

И если вам не мешают использовать стандартные библиотечные алгоритмы, вы можете использовать std::reverse вместо функции Reverse.

...