Вывод значения мусора при использовании функции копирования строки в c ++ - PullRequest
0 голосов
/ 31 января 2020

Я просто использовал функцию копирования в c ++ для копирования строки в массив. Но результат, показанный для следующего кода, содержит значения мусора:

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string s;
    char t[10];

    s = "Hello";
    s.copy(t, s.length());
    cout << t;

    return 0;
}

Вывод: Hellov._Sï

Тогда как, если я делаю то же самое по-другому. Я получаю правильный вывод.

#include <iostream>
#include <string>
using namespace std;

    int main()
    {
        string s = "Hello";
        char t[10];

        s.copy(t, s.length());
        cout << t;

        return 0;
    }

Вывод: Здравствуйте

Может кто-нибудь объяснить, почему это происходит? Я относительно новичок в C ++.

1 Ответ

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

Проблема в том, что std::string::length() не включает терминатор NUL строки. Таким образом, s.copy(t, s.length()); копирует 'H', 'e', 'l', 'l', 'o' в t, но не '\0', который следует. Следующие элементы этого массива не обнуляются (они могут содержать некоторые нули случайно).

Но std::cout при передаче char* ожидает строку с нулевым символом в конце. Он будет продолжать печатать до тех пор, пока не найдет 0 байт или что-то еще не произойдет (переполнение t - неопределенное поведение).

Вы можете «исправить» его, завершив нулем t:

t[s.length()] = '\0';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...