2011-09-09 9 views
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列目になるとき、それは私にアウトクラップスない - エラーか何かを。呼び出し元関数ではなく、この関数内で失敗します。

私が使用しているファイルは、クリスマスキャロル(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行ずつベクタを作成した場合には発生しません。どのようなアイデアが間違っている?

+0

「moveSpaces」とは何ですか? –

+3

私のデバッガは決して私を欺くことはありません...あなたのことはまあまあまあまあまあです。 –

+2

正直なところ、私はこの質問の頭や尾を作ることができません。 「失敗する」とはどういう意味ですか? – MSalters

答えて

8

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

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

+0

もちろん!感謝万円。 – jefflovejapan

+0

良い点:改行文字についてのすべての話は、彼に実際に改行文字があると思うようになりました。しかし、最初の 'endl'では、改行に言及しているにもかかわらず、実際にはそれらを保存せず、出力に再挿入するだけです。 – MSalters

関連する問題