在C中清空char字符串的最佳方法是什么?

时间:2011-12-11 15:21:28

标签: c string

嗨我有一个字符串

name[50] = "I love programming"

发生的事情是我想在调用另一个函数之前清空这个字符串,以便我可以在同一个数组中存储一些东西

这会有用吗?

name[0] = '\0';

或者无论如何在不创建任何新函数或使用任何其他库的情况下清空字符串?

7 个答案:

答案 0 :(得分:5)

将第一个char设置为nul是完全可以接受的。但是,如果该字符串在安全性方面很敏感,那么您应该使用memset将其归零。

编辑:

来自Matteo Italia的回答让我对这个问题有了更深入的了解。根据{{​​3}}(和Matteos答案)memset可以被优化掉,因此不是从内存中删除敏感信息的最佳选择。该文档有几个选项,但它们都不具备可移植性和可靠性,因此它仅为此目的提出了新的函数标准memset_s。此功能尚不存在,因此我们目前停留在非便携式(SecureZeroMemory),非可靠(volatile技巧)或非最佳选项(secure_memset示例)

答案 1 :(得分:3)

在C中实际上没有清空char字符串的概念。它只是一个指向某个已分配内存的指针。您可以以任何方式重用该内存,而无需先将其“清空”。因此,清空它的最简单方法是“只是不要”。

如果由于某种原因想要明确清除字符串的所有内容,请使用其他答案中给出的memset方法。

如果你想“清空”它的意思是当它打印时,什么都不打印,然后是的,只需将第一个字符设置为“\ 0”。


总而言之,这完全取决于你真正想要做什么。 为什么你想“清空”字符串吗?

答案 2 :(得分:2)

请改用memset。这只会使缓冲区无效,但分配的内存将是当变量超出范围时从堆栈中释放的任何内容。

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

答案 3 :(得分:1)

IIRC,您可以这样使用memset:

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

答案 4 :(得分:1)

技术上它是正确的,例如:

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

答案 5 :(得分:1)

memset(name, 0, 50); 

bzero(name, 50);

答案 6 :(得分:1)

这取决于您想要获得的效果。如果您只想将其长度归零,您可以这样做,如您所说:

*name='\0';

相反,如果您要从敏感数据中清除字符串,则应使用memset将其完全归零(某些操作系统还具有“安全”归零功能,应保证不会被优化掉编译器 - 参见例如Windows上的SecureZeroMemory

另一方面,如果您正在调用的函数只使用您作为输出缓冲区传递的缓冲区而忽略其内容,则可以将缓冲区原样保留。