cout ничего не печатает на консоли - PullRequest
0 голосов
/ 04 сентября 2018

Я пытаюсь использовать cout для распечатки строк c из динамически размещенного массива двумерных символов, называемого charArray. Фрагмент, где я печатаю, здесь:

for(int k=0; k<intSize; k++)
{
    std::cout<<"hello"<<std::endl;
    std::cout<<charArray[intSize-1-k]<<std::endl;
}


for(int i = 0; i<intSize; i++)
{
    delete [] charArray[i];
    std::cout<<i<<std::endl;
}
delete [] charArray;

intSize - это количество строк C в charArray. Однако, когда я запускаю программу, "hello" печатается один раз, и ничего больше не печатается, ни charArray, ни i во втором цикле for. Я уже подтвердил ранее в своем коде, что charArray правильно заполнен при успешном использовании cout. Я запустил gdb, чтобы попытаться найти проблему, и в gdb циклы for полностью перебираются, поэтому по какой-то причине после первого cout койты перестают работать. Я также пытался сбрасывать после каждого cout, но все равно одно и то же.

1 Ответ

0 голосов
/ 04 сентября 2018

Попробуйте это:

#include <iostream>
int main()
{
    const char*nul = nullptr;
    std::cout << "before "<< nul << "after\n";
 }

Вывод будет:

 before

Это то, что происходит с вами - вы пытаетесь напечатать строку nullptr. Один из charArray[intSize-1-k] является нулевым. Возможно, читая это за пределами. Запись нулевой строки устанавливает битбит в std::cout.

Чтобы избежать этого, вы можете сделать две вещи:

  1. Перед печатью проверьте, что char* не равно нулю.

  2. std::cout.exceptions(std::ostream::failbit); заставит operator<< сгенерировать исключение в ошибочной строке кода. Отладчик может поймать исключение и позволить вам легко найти ошибку (у gdb есть catch throw). Если у вас есть обработчик исключений, не забудьте вызвать его std::cout.clear();.

...