演算子を使用して配列の内容を割り当てることはできません。=
まず、配列オブジェクトを代入演算子のターゲットにすることはできません(Online C Standard、ドラフトn1256、セクション6.5.16.1、段落1)。 strings[0]
は型の配列オブジェクトであるため、演算子 char [6]
のLHSには表示できません。=
次に、配列式がsizeof
orまたはaddress-of&
演算子のオペランドではなく、別の配列の内容を初期化するために使用される文字列リテラルではない場合、式の型は暗黙的に変換( "decays")されます。 「TのN要素配列」から「Tへのポインタ」。式の値は、配列の最初の要素のアドレスです(セクション6.3.2.1、パラグラフ3)。
文字列リテラル「test」は、静的エクステントを持つchar
(const char
C ++の)5要素配列です(つまり、そのメモリはプログラムの起動時に割り当てられ、プログラムが終了するまで保持されます)。ただし、式に現れる場合
strings[0] = "test";
その型は「charの5要素配列」から「pointertochar」に変換され、その値は最初の要素のアドレスであるため、最終的には、配列オブジェクトにポインター値を割り当てようとします。互換性のあるタイプではありません。悪いjuju、とにかく配列オブジェクトを割り当てることができないことに加えて。
ある配列の内容を別の配列にコピーする場合は、次のように各配列要素を個別に割り当てる必要があります。
strings[0][0] = 't';
strings[0][1] = 'e';
strings[0][2] = 's';
strings[0][3] = 't';
strings[0][4] = 0;
あるいは
size_t len = strlen("test");
size_t i;
for (i = 0; i < sizeof strings[0] - 1 && i < len; i++)
strings[0][i] = "test"[i]; // yes, you can subscript a string literal
strings[0][i] = 0;
または、、、、、などmemcpy()
のライブラリ関数を使用します。strcpy()
strncpy()
strcat()
sprintf()
strcpy(strings[0], "test");
また
strncpy(strings[0], "test", sizeof strings[0] - 1); // -1 to leave room
// for 0 terminator
// if necessary
また
sprintf(strings[0], "%*s", (int) sizeof strings[0] - 1, "test");
次のように、宣言時に配列の内容を初期化できることに注意してください。
char foo[] = "test"; // foo is implicitly sized to 5 (+1 for 0 terminator)
int bar[] = {1,2,3,4,5}; // again, size is implied from initializer
float f[3] = {1.0, 2.0, 3.0}; // Initializer cannot contain more items than
// array is sized for
別の回答へのコメントで、strcpy()
vsの使用をめぐって陽気な戦争があるようです。strncpy()
私の立場は、与えられた状況に適切な方を使用することです。バッファが可能な限り最大の入力を処理するのに十分な大きさであることがわかっている場合は、を使用してstrcpy()
ください。そうでない場合は、を使用strncpy()
しますが、0ターミネータを手動で追加する必要がある場合があることに注意してください。