2011-12-11 2394 views
0

您好我有一個字符的字符串在C中清空char字符串的最佳方法是什麼?

name[50] = "I love programming"

發生什麼事是,我想之前我打電話給我的另一個功能,清空該字符串,這樣我可以存儲一些在同一個陣列

在將這項工作?

name[0] = '\0';

或反正是有空字符串沒有創建任何新功能或使用任何其他圖書館嗎?

+0

在「清空」它之後,你想幹什麼? – Staven

+0

那麼我的任務是找到最長的單詞,所以我已經發現'name'中最長的單詞是編程,因此我將它們存儲在另一個名爲'longest_word'的數組中,所以我希望數組在空閒數組之前找到空並存儲這就是爲什麼我需要知道如何清空數組@Staven – Ali

+2

然後,您可以使用'strncpy(longest_word,name,49)'('longest_word'必須具有至少49 + 1的大小\ 0字節)。 'strncpy'不關心'longest_word'中的數據,它只會覆蓋它,所以你不需要以任何方式「清空」它。 – Staven

回答

2

使用memset來代替。這隻會使緩衝區無效,但分配的內存將會在變量超出範圍時從堆棧中取消分配。

memset (name,'\0',sizeof(name)); 
+0

爲什麼更喜歡這個「名稱[0] ='\ 0';」?你的線性交易時間是恆定的。 –

1

IIRC,你可以使用memset的是這樣的:

char * myString; 
... 
size_t len = strlen(myString) 
memset (myString, 0,len); 
5

第一個字符設置爲NUL是完全可以接受的。但是如果這個字符串在安全性方面很敏感,那麼你應該把它與memset歸零。

編輯:從利瑪竇意大利

的回答讓我挖了一個深一點關於這個問題的。據this document(和Matteos答案)memset可能被優化掉,所以是不會從內存中刪除敏感信息的最佳選擇。該文件有幾種選擇,但都不是便攜式和可靠的,因此它提出了僅用於此目的的新功能標準memset_s。此功能還不存在,所以我們目前堅持非便攜式(SecureZeroMemory),不可靠(volatile伎倆),或非最佳選擇(例如secure_memset)。

3

真的沒有排空字符字符串中C.這僅僅是指出了一些分配的內存指針的概念。您可以以任何您希望的方式重新使用該內存,而不必先「清空」它。所以,最簡單的方法是「不要」。

如果要明確清晰的字符串出於某種原因的所有內容,可以使用在其他的答案中給出的memset方法。

如果你想「空」就在這個意義上,當它打印出來,什麼都不會被打印,那麼,僅僅是第一個字符設置爲'\ 0' 。


總之,這一切都取決於你真的做什麼。 爲什麼你想「清空」字符串?

1

Tehnically它是正確的,例如:

char array[10] = "hello"; 
printf("%d\r\n", strlen(array)); // prints 5 
array[0] = '\0'; 
printf("%d\r\n", strlen(array)); // prints 0 
1
memset(name, 0, 50); 

bzero(name, 50); 
1

這取決於從要取得的效果。如果你只是想零它的長度,你可以做,因爲你說:

*name='\0'; 

相反,如果你想清理從敏感數據的字符串,你應該完全memset零它(一些操作系統也有一個「安全的」調零功能,應該保證不被編譯器優化 - 例如參見Windows上的SecureZeroMemory)。另一方面,如果您正在調用的函數只是使用您正在傳遞的緩衝區作爲輸出緩衝區而不考慮其內容,那麼您可以保持緩衝區不變。

相關問題