2012-07-08 94 views
0

在下面的代碼,二維字符數組用C

char strArr[5][20]; 
int i; 

for(i=0; i<5; i++) 
{ 
    printf("string %d: ", i+1); 
    gets(strArr[i]); 
} 

strArr[0]=strArr[1]; //have an compile error on this line. Why cannot assign? 

作爲評論了上面的代碼塊的最後一行,爲什麼具有編譯錯誤(不兼容的類型)?左和右操作數都是char *類型的?

+1

使用fgets()代替gets()來避免緩衝區溢出。 fgets(strArr [i],20,stdin)。 – 2012-07-08 06:11:46

+0

你的問題與二維數組無關。這只是關於數組而已。 – 2012-07-08 06:29:08

回答

4

左側和右側操作數的類型都是char[20]而不是char*。變量實際上爲它們保留了存儲空間,它們不僅僅是指向字符串的指針。因此,如果合法,這項任務將從一個陣列複製20個字符到另一個陣列。

C不允許您使用賦值運算符複製數組。改爲使用strcpy,strncpymemcpy。 (我懷疑錯誤的具體措辭是因爲一個陣列在某些地方衰減成指針,我期望左側的任務是而不是其中一個地方,而在右側使用)

+0

'strcpy'只有在數組中包含空終止字符串 – slashmais 2012-07-08 06:19:15

+0

謝謝!它確實有幫助。 – ramsse 2012-07-08 07:54:23

2

char Array[n][m]:在幾乎所有的語言中,它的意思是:數組的數組。所以,Array[0]Array[1] ....是一個數組。實際上,它是指向每個元素連續記憶的指針。

而這個數組的類型是:char[m]。而且,當您編寫:arrayX = arrayY時,您需要將arrayY中的所有值複製到arrayX,但C不允許這樣做。你必須手工複製:

for(int i=0; i<=sizeof(arrayX)/sizeof(char); i++) 
     arrayX[i] = arrayY[i]; 

我經常使用memcpy,但背景是在上面的代碼庫。

memcpy (strArray[1],strArray[0],sizeof(strArr[0])); 

但是,如果你聲明這樣的,沒有編譯錯誤:

char * strArray[5][10];

因爲它只是複製指針的值:指向該指針指向的平均副本。但是,當然,它會非常改變你的代碼。我只是在這裏畫得更清晰。

希望這幫助:)

+0

謝謝!它真的有幫助 – ramsse 2012-07-08 07:54:37

1

您正在試圖改變字符數組strArray [0]與strArray的[1],這是不允許的基地址。 因此您正在收到錯誤。

+0

char * str1 =「CPointer」; char * str2 =「C++指針」; STR1 = STR2;沒有編譯錯誤。我認爲你可以改變基地址。編譯器說這個問題是由不兼容的類型造成的。 – ramsse 2012-07-15 17:38:41