1

空のchar配列が必要ですが、次のようにしようとすると次のようになります。

char *c; 
c = new char [m];
int i;
    for (i = 0; i < m; i++)
    c[i] = 65 + i;

そして、私は印刷しますcc = 0x00384900 "НННННННээээ««««««««юоюою" サイクル後、次のようになることがわかり0x00384900 "ABCDEFGээээ««««««««юоюою" ます。この問題をどのように解決できますか?または多分文字列で方法がありますか?

4

5 に答える 5

3

文字列を作成しようとしている場合は、文字シーケンスがヌル文字で終了していることを確認する必要があります\0

言い換えると:

char *c; 
c = new char [m+1];
int i;
    for (i = 0; i < m; i++)
    c[i] = 65 + i;
c[m] = '\0';

これがないと、文字列の関数は文字列printfがどこで終了するかわかりません。

printf("%s\n",c); // should work now
于 2012-06-18T15:50:08.837 に答える
3

ヒープ配列を作成すると、OS はそれを初期化しません。これを行うには、次のオプションを使用します。

  1. 配列を静的またはグローバルに割り当てます。配列は自動的にゼロで埋められます。
  2. ヒープで初期化された配列またはスタック配列で使用::memset( c, 0, m );して、ゼロで埋めます。
  3. std::string などの高レベルの型を使用します。
于 2012-06-18T15:52:56.807 に答える
2

デバッガーが文字列を解釈しようとしていると思います。C または C++ で char 配列を使用して文字列を表す場合、文字列の末尾に null バイトを含める必要があります。したがって、m + 1c に文字を割り当ててから を設定c[m] = '\0'すると、デバッガは期待どおりの値を返すはずです。

于 2012-06-18T15:50:38.557 に答える
1

動的に割り当てられた文字列が必要な場合はstring、標準ライブラリのクラスを使用するのが最適なオプションです。

#include <string>

std::string s;
for (i = 0; i < m; i++)
    s.push_back(65 + i);
于 2012-06-18T16:04:21.307 に答える
0

C 文字列は null で終了します。つまり、最後の文字はヌル文字 ('\0' または単に 0) でなければなりません。

文字列を操作する関数は、配列の先頭 (パラメーターとして渡した、配列の最初の位置) と null 値の間の文字を使用します。配列にヌル文字がない場合、関数は、ヌル文字が見つかるまでメモリを繰り返し渡します (メモリ リーク)。そのため、例にガベージが印刷されています。

コード内に のようなリテラル定数がある場合printf("Hello");、長さ 6 の char の配列 ('H'、'e'、'l'、'l'、'o'、および '\0') に変換されます。

もちろん、このような複雑さを避けるために、std::string を使用できます。

于 2012-06-18T17:02:52.877 に答える