1

そこで、Introduction to Algorithms book (CLRS) の Longest Common Subsequence アルゴリズムを C++ で実装しましたが、問題なく動作します。私がこのようなことをすると:

./lcs abc bc > OUTPUT

OUTPUTでファイルを開くと、次のvimように表示されます。

2 bc^@

どちらが正しいですか、その奇妙な^@記号はありません。私はいくつかのグーグルをしましたが、これはある種のNULLキャラクターのように見えますか?

私は前にこの問題に遭遇したことはありません..誰もそれを取り除く方法を知っていますか?

ありがとう!-kstruct

編集 印刷を行うコードは次のとおりです。

cout << lcsLength << " ";
    if (lcsLength > 0) cout << lcsString;

return 0;

はどこlcsStringですかstd::string。それが役立つかどうかはわかりません...

4

2 に答える 2

4

lcsString を出力するコードを示しましたが、C スタイルの文字列とは異なり、std::string長さが文字列データ自体とは別に維持されるため、型に null 文字を含めることができます。

以下を追加して、文字列の内容をダンプしてみてください。

cout << "length of lcsString: " << lcsString.length() << endl;
cout << '"' << lcsString << '"' << endl;
for (int i = 0; i < lcsString.length(); ++i) {
    cout << hex <<  int(lcsString[i]) << " ";
}
cout << endl;

私はあなたが見ると確信しています:

length of lcsString: 3
"bc "
62 63 0 

lcsString次に、最後にヌル文字が含まれるように作成 (または変更) するために何をしているのかを調べる必要があります。

于 2012-05-23T04:47:04.807 に答える
4

それNULは(文字値であり、すべてビットゼロであると定義されています)、そうではありませんNULL(これはポインターであり、ほとんどの場合すべてビットゼロですが、必須ではありません)。

確実に知るにはコードを確認する必要がありますが、これの最も可能性の高い原因は、必要なよりも 1 バイト多い C 文字列 (常にNUL最後のバイトとしてある) を出力したことです。

于 2012-05-23T04:16:00.863 に答える