Cout дает вывод мусора при циклическом преобразовании - PullRequest
0 голосов
/ 10 июня 2019

При выполнении следующего кода я получаю то, что ожидаю, плюс неожиданный вывод:

#include <iostream>

using std::cout;
using std::endl;

int main()
{
    const  char ca[] = {'h', 'e', 'l', 'l', 'o'};
    const char *cp = ca;
    while (*cp)
    {
        cout << *cp << endl;
        ++cp;
    }
}

Вывод:

h
e
l
l
o
ⁿ
■
m

Какие последние оставшиеся символы?Есть ли в массиве const что-то, что не учитывается?

Ответы [ 2 ]

5 голосов
/ 10 июня 2019
while (*cp)

Этот цикл заканчивается, когда cp указывает на нулевой символ.

const  char ca[] = {'h', 'e', 'l', 'l', 'o'};

Массив не содержит нулевого символа.

Поэтому цикл повторяется по массиву и за его пределами.Поведение доступа к массиву за его пределами не определено.

2 голосов
/ 10 июня 2019

Циклы while до *cp равны 0.

Это исправление:

#include <iostream>

using std::cout;
using std::endl;

int main()
{
    const  char ca[] = { 'h', 'e', 'l', 'l', 'o', '\0' }; // <-- add '\0'
    const char* cp = ca;
    while (*cp) // loop until *cp equal '\0'
    {
        cout << *cp << endl;
        ++cp;
    }
}

Или это:

#include <iostream>

using std::cout;
using std::endl;

int main()
{
    const  char ca[] = { "hello" };
    const char* cp = ca;
    while (*cp)
    {
        cout << *cp << endl;
        ++cp;
    }
}
...