-1

cstrings について明確にしたい質問がいくつかあります。

1) 初期化: 次のように文字の配列を宣言するとき、C++ は自動的にそれを cstring として定義しますか? または(私が信じているように)文字の配列ですか?

char a[10];

言い換えれば、これは null ターミネータ ('\0') のみを含む文字の配列ですか、それとも空の文字配列ですか?

2) cstring のインデックス ( i.e. a[i] = ch+1;) を直接操作する場合、cstring は自動的にヌル ターミネータを処理しますか、それともスペースを空けて挿入するのはプログラマの責任ですか?

コード例 (これが正しい答えだと思います):

char a[10];
int i = 0;
cin.get(ch);

while(ch != '\n' || i < 9) {
    a[i] = ch;
    counter++;
    cin.get(ch);
}
a[i] = '\0';    //either the last index(9) 
                //or the one right after the
                //last input will be set to '\0'

3)<cstring>ライブラリ (strncpy、strncat など) を使用する場合、null ターミネータは処理されますか? 例:

char myCstring[] = "I am a cstring";  //size of 15 (including '\0' at i == 14)
strncpy(myCstring, "I am NOT a string object", 14);

これは次の配列になりますか?

| I |   | a | m |   | N | O | T |   | a |   | s | t | r | '\0' |
  0   1   2   3   4   5   6   7   8   9  10  11  12   13   14

そして最後に:

char myCstring[] = "I am a cstring";  //size of 15 (including '\0' at i == 14)
strncpy(myCstring, "I'ma cstring", 14);

これは次の配列になりますか?

| I | ' | m | a |   | c | s | t | r  | i | n | g | '\0' |x|x|
  0   1   2   3   4   5   6   7   8    9   10  11   12  13 14

混乱して申し訳ありません。

4

1 に答える 1

1

chars1)通常は 8 ビット整数の配列です。

2) いいえ、配列として扱われます - すべてが int の配列の場合とまったく同じように機能します。

3) 多くの人strncpyが安全ではないと考えています - 文字列の最後に '\0' 文字を追加しますが、あなたの場合と同様に、文字列が切り捨てられたときは追加しません。結果の配列は次のようになります。

| I |   | a | m |   | N | O | T |   | a |   | s | t | r | '\0' |
  0   1   2   3   4   5   6   7   8   9  10  11  12   13   14

15ただし、サイズを渡した場合、末尾の '\0' は存在しません。これは、配列が 1 文字短く終了したと関数が通知されたためです。sizeof(myCstring)サイズとして渡した場合、出力は異なります。

| I |   | a | m |   | N | O | T |   | a |   | s | t | r | i |
  0   1   2   3   4   5   6   7   8   9  10  11  12   13  14

文字列を読み取ろうとすると、セグメンテーション違反を引き起こす可能性がある末尾の '\0' がないことに注意してください (ただし、場合によってはそうする必要がないため、デバッグが難しくなります)。

4) はい、ポイント 3 で説明したとおりです。

于 2014-12-14T01:53:29.290 に答える