Почему этот символ останавливает мою программу? - PullRequest
1 голос
/ 09 сентября 2011

Имеет ли символ перевода строки какое-то особое значение в c ++? Это не-ASCII символ?

Я пытаюсь построить цепочку Маркова для каждой уникальной n-символьной подстроки в большем фрагменте текста. Каждый раз, когда я сталкиваюсь с новой уникальной подстрокой, я вношу ее в карту, значение которой представляет собой вектор из 256 элементов (один элемент для каждого символа в расширенной таблице ASCII).

Нет проблем, когда я распечатываю все содержимое файла ("lines" - это вектор строк текста, построенных с использованием ifstream и getline):

for(int i=0; i<lines.size(); i++) cout << lines[i] << endl;

Весь текстовый файл отображается в консоли. Проблема возникает, когда я пытаюсь вернуть символ новой строки в функцию, которая ожидает символ. «moveSpaces» - это целочисленная константа, которая определяет, сколько символов дальше для перемещения в векторе строк на каждой итерации.

char GetNextChar(int row, int col){
    for (int i=0; i<MOVESPACES; i++) {
        if (col+1<lines[row].size()) {
            col+=1;
        } else {        // If you're not at the end of the line keep going
            row+=1;     // Otherwise, move to the beginning of the next row
            col=0;
        }
    }
    return lines[row].at(col);
}    

Я прошелся с отладчиком, и когда он доходит до 1-го столбца 2-й строки, он обрушивается на меня - без ошибок или чего-то еще. В этой функции происходит сбой, а не в вызывающей функции.

Файл, который я использую - A Christmas Carol (первое, что появилось в Project Gutenberg). Для справки вот первые несколько строчек:

STAVE I:  MARLEY'S GHOST

MARLEY was dead: to begin with. There is no doubt
whatever about that. The register of his burial was

Функция обрывается, когда она должна вернуть первый символ во второй строке. Этого не произойдет, если я избавлюсь от новой строки или если я строю вектор «линий» сам построчно в программе. Есть идеи, что случилось?

1 Ответ

8 голосов
/ 09 сентября 2011

Ваша функция GetNextChar предполагает, что если вы находитесь на последнем символе в некоторой строке, в следующей строке будет символ. Что произойдет, если в следующей строке нет символа? Это может произойти в двух местах: когда вы достигли конца файла или когда следующая строка - пустая строка.

Вторая строка - пустая строка.

...