Почему я получаю значение мусора при выводе массива символов на консоль?

0

Я всегда получаю такую мусорную стоимость, как этот "Íýýýý" "" "" "" "" "" "в конце, когда я вывожу свой массив. Что я делаю не так?

void func()
{
    const int size = 100;
    char * buffer = new char[size];
    for(int i=0; i<size; i++)
        buffer[i] = ' ';

    cout<<buffer;
}

Однако, если я использую цикл for для вывода буфера, нет значения мусора.

  • 0
    stackoverflow.com/q/20267101/560648
  • 0
    что не так с std::cout << std::string(100, ' '); ? 100 мест на экране, без индексации, без циклов, без утечек памяти, ...
Теги:

2 ответа

5
Лучший ответ

Поскольку вы не завершаете нулевой буфер, std::cout.operator<<(char*) попытается найти \0 качестве его завершающего символа.

Как указано в комментариях, не стесняйтесь добавлять этот \0 к концу вашего буфера :).

  • 0
    но, пожалуйста, поставьте разделитель в конце буфера, а не после конца -> buffer[size-1] = '\0';
  • 0
    @ P0W: i не доступен в этой области
0

ScarletAmaranth прав. Строки стиля C (массив символов) должны заканчиваться символом '\ 0'. То, что функции, которые играют с массивами char (cout в этом случае), знают, когда строка заканчивается в памяти. Если вы забыли символ "\ 0" в конце массива, cout печатает все символы в массиве и затем печатает любые данные в памяти после массива. Эти другие данные - мусор, и поэтому вы видите эти странные персонажи.

Если вы используете тип строки (более [стиль CN10]) вместо массивов символов, у вас не будет этой проблемы, потому что тип строки не использует '\ 0' в качестве разделителя строк.

С другой стороны, вы не видите мусора, когда используете цикл для итерации по 100 элементам массива только потому, что вы печатаете только эти 100 символов. Я имею в виду, что вы точно контролируете то, что вы печатаете, и знаете, когда остановиться, вместо того, чтобы оставлять функцию cout, когда останавливать печать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню