2011-01-22 22 views
1

重複の可能性:それはIncompatible types in assignmentを言ってコンパイルされませんCの文字列配列

char result[3][4]; 

result[0] = "horse"; 
result[1] = "pig"; 
result[2] = "chicken"; 


string literal in c
Assigning strings to arrays of characters

私は、次のコードを得ました。私は間違って何をしていますか?

+0

これらはchar *でありchar [4]ではありません... – leppie

+0

@birryree:その質問には独自の重複がありますhttp://stackoverflow.com/questions/579734/assigning-strings-to-arrays-of- character –

答えて

4

charは単一の文字です(例: 'h')

文字列ポインタが必要です。

char *result[3]; 

あなたはそれを使用すると、個々の文字列の内容を変更することはできません。この方法で(それは定数と別の場所に保存されている。)

を行う場合にも何かができる忘れないでくださいこの

char *result[3]; 

result[0] = malloc(100 * sizeof(char)); 
strcpy(result[0],"horse"); // or strncpy(result[0],5,"horse") 
etc 
+0

OPの例では、 'result'は' char [3] [4] 'です。' result [i] 'は' char 'ではなく 'char [4]'です。 – peoro

+0

@peoro:true。多分、私は答えをよりよく表現することができました。 – Hogan

+0

@ user282635:この回答もあわせて読むと、わかりやすくなります。 http://stackoverflow.com/questions/579734/assigning-strings-to-arrays-of-characters – Hogan

1

のようにあなたは、おそらくたかった:

char* result[3]; 
result[0] = "horse"; 
result[1] = "pig"; 
result[2] = "chicken"; 

あなたは2のために間違っていたやりました理由。

まず、そのような文字配列に文字列を割り当てることはできません。たとえば、strcpyを使用する必要があります。

第二には、ご使用のアレイの寸法も間違っていた、char array[4]は明らかに"horse"または"chicken"を保持していますので、あなたは、私はそれをコンパイルします(上記の言ったことを修正した場合にそれも動作しないだろうが、あなたは、メモリへの書き込みをされるだろうあなた書くべきではない)。

char配列自体を格納する代わりに、訂正されたコードが行うもので、"horse"などが格納されているメモリ内の場所へのポインタを格納します。したがって、アドレスを保存するだけで、=演算子を使用することができます。

1

配列は変更不可能ですlvaluesつまり、配列に割り当てることはできません。

ポインタの配列を使用する必要があります。 strcpy()をあなたは言葉のサイズを大きくする必要がchar result[3][4];

-1

に変更して使用します。

char result[3][8]; // at least 8! 

strcpy(result[0], "horse"); 
strcpy(result[1], "pig"); 
strcpy(result[2], "chicken"); 
+0

@downvoter:私のコードをコンパイルして実行しましたか?それは完全に動作します! – BlackBear

+0

あなたの最初のコードはナンセンスで、あなたはそれを知っています。もしあなたが「それを固定してもうナンセンスではない」と言えば、私はダウンボートを削除したでしょう。代わりに、あなたはダムを演奏することを選択します。 –

+0

@ニコラス:私はそれを修正した__before__をdownvotedあなたを知らなかった。 – BlackBear

2
char result[3][10] = { 
    "horse", 
    "pig", 
    "chicken", 
} 

または

char result[3][10]; 

strcpy_s(result[0], 10, "horse"); 
strcpy_s(result[1], 10, "pig"); 
strcpy_s(result[2], 10, "chicken"); 
0

あなたはリテラル文字列を割り当てることができます(例:"horse"を) char配列に宣言したときにのみ配列を返します。

char result[3][4] = { "horse", "pig", "chicken" }; 

が、警告:あなたはこのように行うことができ

char array[4] = "str"; // is OK 
char array2[4]; 
array2 = "str"; // is NOT OK. 

"horse""chicken"char[4]より長いです。


あなたはすでに宣言char配列に文字列リテラルを割り当てたい場合は、strcpy(または他の同様の機能)を使用する必要があります。


の多くによって提案された他の解決策は、char型のポインタの配列としてresultを宣言することです:char *result[3];、しかし、あなたはこのように行う場合は、result[i]が指す文字列の内容を変更することはできません。

1

次のように動作します。 char result [3] [10] = {"horse"、 "pig"、 "chicken"};

また、「chicken」と「horse」には4文字以上の文字が含まれているため、結果[3] [4]([4]部分)は正しくありません。

1

resultchar result[3][4]として宣言し、と似たようなになりますresult[0]として使用するので、これは動作しません:char * const result。定数ポインタは割り当てを許可しません。すでに列の配列へのポインタ "[4]"を含んでいます。