2015-09-10 49 views
1

經歷了幾十個教程&編程指南,答案並沒有變得明顯,因此後。請善待。
手頭的事情是雙d字符數組的實際操作。{「aaaaa」,「bbbbb」,「ccccc」,... M}
第一個問題是聲明這樣的初始化獸,與以在字符串「AAAAA」改變數據「BBBBB」等
的聲明和初始化去爲:如何管理2維Char陣列?

char *chararray[M][N + 1] //M & N are set as constant values, the extra 1 for the null terminator. 
    memset (chararray, '\0', sizeof(chararray)); //Assuming array bounds remain constant, in the hope that dynamic allocation is not required 

假設還存在定義文字的字符串:

char *copyme; //Has been given a string value well within the bounds of N 

嘗試使用此i時出現問題ñstrcat的或strcat_s(strcpy的或strcpy_s類似):

strcat_s (chararray [i][0], N + 1, (char *) copyme); //i ranges from 0 to M 

具有不跨陣列處理這種方式,我確實注意到這個tutorial那的memcpy是唯一的出路任何代碼來。正確?

另外,從Main調用函數時,如何實現John Bode的General Procedure? (爲了簡潔起見,這可能需要提交作爲一個單獨的問題,)

+2

'char x [M] [N + 1];'會是char的二維數組。你可以確認你是否想要這個,或者'char * x [M] [N + 1]'這是一個二維指針數組嗎? –

+0

想要指針。 _我想_ char chararray [M] [N + 1]似乎根本不適用於strcpy。 –

+0

所以你想能夠存儲'M' x'N + 1'個字符串?例如。如果'M'是5,'N'是6,那麼你存儲35個字符串。 –

回答

1

你大概是爲了意味着

char chararray[M][N + 1]; 

然後複製您指定的第一個索引

strcat_s(chararray[i], N + 1, (char *) copyme); 
字符串

如果已宣佈它作爲

char *chararray[M][N + 1] 

那麼你有指針的2維陣列,其是NULL然後當你反引用他們,你得到一個錯誤:

strcat_s(chararray [i][0], N + 1, (char *) copyme); // boom! 
+0

除非chararray被錯誤地聲明爲_pointers_的2D數組,因此您無法將任何內容複製到其中,程序可能會崩潰並燒燬。 – Lundin

+0

@Lundin我認爲他編輯了這個問題 –

+0

他沒有。 'char * chararray [M] [N + 1]' – Lundin

3

你的初始化是錯誤的,你正在申報的指針不是字符的二維數組。將其更改爲char chararray[M][N + 1]

另外,關於對memset的註釋,您使用靜態維度聲明瞭數組,因此如果選擇上述方法,則邊界將永遠不會更改,並且不能使用動態分配。

  • 在你只處理只讀字符串文字的情況下,你可以使用const char*每文字:

    基本上使用C中的字符串數組,當你有以下選項。這種情況下的字符串數組將是const char*指針數組。

  • 同樣,如果字符串分配在其他地方,而不是陣列中,則可以有一個指針數組。你會有一個查詢表。
  • 如果字符串的長度已知最大值,則可以使用靜態維度聲明它,如char chararray[M][N + 1]。這是一個二維數組字符,或者如果您願意:一組字符數組。
  • 如果字符串的長度未知,如果您需要它們是靈活的,或者如果您要分配大量字符串(數百個),則可以將它們分配到堆上。在這種情況下,你應該使用一個指針數組,其中每個指針通過malloc和strcpy()指定一個字符串。
+0

在我的情況下,混亂是在strcpy&strcat的描述中。第一個參數是char * _Dst,第二個是常量char * _Src。這兩個char *都在[MSDN](https://msdn.microsoft.com/en-us/library/tbyd7s1y.aspx?f=255&MSPPError=-2147217396)示例中。 –