2011-12-11 2393 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)。另一方面,如果您正在调用的函数只是使用您正在传递的缓冲区作为输出缓冲区而不考虑其内容,那么您可以保持缓冲区不变。

相关问题