2010-01-18 12 views
0

說我已經在我的程序中聲明瞭char *數組[size],並在其中放入了一些字符串。如果我再給他們分配一些東西,他們不會取代以前的內容,但他們繼續追加以前的內容。如何正確清除/重置所有內容?當你寫arr中重置一個char *數組[大小]內容

void function(char* action) 
{ 
    const int myMainArrSize = 3; 
    char *myMainArr[myArrSize]; 

    char *myArrOne[] = {"String 1", "String 2", "String 3"}; 
    char *myArrTwo[] = {"Another String 1", "Another String 2", "Another String 3"}; 

    if(strcmp(action, "action1")==0) 
    { 
     for(int i=0;i<myMainArrSize;i++) 
     { 
     myMainArr[i] = myArrOne[i]; 
     } 
    } 

    if (strcmp(action, "action2")==0) 
    { 
     for(int i=0;i<myMainArrSize;i++) 
     { 
     myMainArr[i] = myArrOne[i]; 
     } 
    } 
} 
+1

如果這是C++,爲什麼不使用'std :: string'?然後's.clear();'。 – GManNickG 2010-01-18 05:46:53

+0

我會給你一個想法..你爲什麼不使用兩個陣列一個可以改變另一個重置.. – jjj 2010-01-18 05:52:41

+0

我重申爲C. Jj:這取決於你如何將數據放入第一次。你可以發佈該代碼嗎? – Potatoswatter 2010-01-18 05:53:19

回答

0
memset(arr, '\0', size) 

或NUL,終止字符串:

int n = min(strlen(str, size - 1)); 
strncpy(arr, str, n); 
arr[n] = '\0'; 
0

聽起來像是你增加該指針,並保持寫在那裏。你必須將指針保存到數組的起始位置,當你想重置你的char數組時,你應該用指針將它的內容清零(使用像memset(array, 0, size)這樣的調用),然後開始寫回。

0

如果將新字符串附加到數組的內容或覆蓋它,則取決於用於添加數據的函數。例如strcat()會附加,而strcpy()將被覆蓋。

如果你只是想「截斷」的字符串長度爲零就足夠了設置的第一個字符爲0:

array[0] = '\0'; 
6

你有

char *array[size]; 

這使得array數組指針。具體而言,arraysize指針的數組。陣列中的每個元素(array[0]array[size-1])類型爲char *

我想如果你瞭解array是如何工作的,這將有助於:

+-------+-------+-------+-------+ 
| [0] | [1] | [2] | [3] | 
+-------+-------+-------+-------+ 
    |  |  |  | 
    |  |  |  | 
    |  |  |  | 
    v  v  v  v 

上述每個方框表示一個指針,箭頭在哪裏,他們都指向。他們的存儲空間還沒有分配給他們,所以他們只是「在那裏」,沒有任何用處。您可以爲它們創建內存(malloc()等,C,new[],C++),或者您可以將它們指向某個現有位置。

你說:

...把​​一些字符串它。如果我再給他們分配一些東西,他們不會取代以前的內容,但他們繼續追加以前的內容。如何正確清除/重置所有內容?

現在還不清楚你如何把「字符串」放在裏面。你的意思是你在存儲字符串array[0] .. array[size-1]?怎麼樣?你是否給它們分配文字字符串?喜歡的東西:

array[0] = "String"; 

如果你是這樣做的話,你可以重新分配的指針和字符串不會追加。換句話說,如果以後在程序中你做:

array[0] = "Another string"; 

你重新分配指針array[0]指向"Another string",因此你沒有追加。

因此,總之,我們需要看到更多的代碼,並且您可能需要更好地理解指針和數組。

編輯:(!不是一個錯字)基於您的編輯,指針myMainArr[i](用於i=0i=3),得到重新分配,從myArrOnemyArrOne相應的元素,這取決於action內容。所以,如果你打印它們(例如,printf("%s\n", myMainArr[0]);),你不應該看到任何字符串被追加。另外,myMainArr對於函數function是本地的,所以當函數返回時它會被破壞。 (順便說一句,你爲一個功能的陣列和function名稱array的選擇做出回答的問題時,它很難被明確!)

如果您有問題,請張貼完整最小可編譯顯示問題的代碼。