1

サンプル コードを実行すると、wordLength は 7 です (したがって、出力は 7 になります)。しかし、私の char 配列は最後にいくつかの非常に奇妙な文字を取得します。

wordLength = word.length();

cout << wordLength;

char * wordchar = new char[wordLength]; //new char[7]; ??

for (int i = 0; i < word.length(); i++) //0-6 = 7
{
    wordchar[i] = 'a';
}

cout << wordchar;

出力: 7 aaaaaaa²²²²¦¦¦¦¦¦ÂD╩2¦♀

望ましい出力は次のとおりです: aaaaaaa... その背後にあるゴミは何ですか?? そして、それはどのようにしてそこに行き着いたのですか?

4

4 に答える 4

5

\0の最後に追加する必要がありwordcharます。

char * wordchar = new char[wordLength +1];
//add chars as you have done
wordchar[wordLength] = `\0`

その理由は、C 文字列が null で終了するためです。

于 2013-09-29T16:21:29.860 に答える
3

C 文字列は、文字列の終わりを示す '\0' 文字で終了します (対照的に、C++std::stringは長さを別々に格納するだけです)。

文字をコピーするwordchar際に文字列を終了しなかったため、operator<<出力が の場合、が指すメモリ位置の後にあるwordchar最初の文字が見つかるまで続き、その過程ですべてのガベージ値を出力します間に記憶があります。\0wordchar

この問題を解決するには、次のことを行う必要があります。

  1. 割り当てられた文字列を 1 文字長くします。
  2. \0最後に文字を追加します。

それでも、C++ では、通常はstd::string.

于 2013-09-29T16:24:00.753 に答える
1

使用する: -

char * wordchar = new char[wordLength+1]; // 1 extra for null character

forループの前と

wordchar[i] ='\0'

for loop の後、C 文字列は null で終了します。

これがないと、最初のヌル文字が見つかるまで印刷を続け、すべてのガベージ値を印刷します。

于 2013-09-29T16:21:18.427 に答える
1

末尾のゼロを避けます。それが原因です。

C および C++ では、エコシステム全体が文字列の長さを処理する方法は、末尾のゼロ ('\0'または単に0数値) を想定することです。これは、パスカル文字列などとは異なります。この場合、メモリ表現は、特定の文字列を構成する次の文字の数を示す数字で始まります。

したがって、保存したい特定の文字列コンテンツがある場合は、末尾のゼロに追加の 1 バイトを割り当てる必要があります。メモリの内容を操作する場合は、末尾のゼロを常に念頭に置いて保持する必要があります。そうstrstrしないと、他の文字列操作関数がトラックから外れて実行されたときにメモリの内容を変更し、次のメモリ セクションで作業を続けることができます。末尾のゼロstrlenがない場合も偽の結果になり、最初のゼロに遭遇するまでカウントされます。

この間違いを犯しているのはあなただけではありません。セキュリティの脆弱性とその悪用において重要な役割を果たしていることがよくあります。このエクスプロイトは、関数が道を外れ、本来の意図以外のものを操作するという副作用を利用します。これは C の非常に重要で危険な部分です。

C ++では(質問にタグを付けたように)std::string、Cスタイルの操作の代わりにSTLの、およびSTLメソッドを使用することをお勧めします。

于 2013-09-29T16:21:33.730 に答える