1

改行文字はc ++で何らかの特別な意味を持っていますか? 非ASCII文字ですか?

大きなテキスト内の一意の n 文字の部分文字列ごとにマルコフ連鎖を構築しようとしています。新しい一意の部分文字列に遭遇するたびに、その値が 256 要素のベクトル (拡張 ASCII テーブルの文字ごとに 1 つの要素) であるマップに入力します。

ファイルの内容全体を出力しても問題ありません (「行」は、ifstream と getline を使用して作成されたテキスト行のベクトルです)。

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

テキスト ファイル全体がコンソールに表示されます。この問題は、char を予期している関数に改行文字を返そうとすると発生します。「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);
}    

私はデバッガーを使いこなしましたが、2 行目の 1 列目に到達すると、エラーも何も発生しませんでした。呼び出し関数ではなく、この関数内で失敗します。

私が使用しているファイルは 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

関数は、2 行目の最初の文字を返す必要があるときに中断します。これは、改行を削除した場合、またはプログラム内で「行」ベクトルを自分で 1 行ずつ作成した場合には発生しません。何が問題なのですか?

4

1 に答える 1

8

関数GetNextCharは、ある行の最後の文字にいる場合、次の行に文字があると想定しています。その次の行に文字がない場合はどうなりますか? これは 2 つの場所で発生する可能性があります: ファイルの終わりに到達した場合、または次の行が空の文字列である場合です。

2 行目は空の文字列です。

于 2011-09-09T11:05:08.143 に答える