清空 C 字符串的正确方法
Posted
技术标签:
【中文标题】清空 C 字符串的正确方法【英文标题】:Proper way to empty a C-String 【发布时间】:2011-12-27 19:32:00 【问题描述】:我一直在用 C 语言开发一个项目,该项目需要我经常处理字符串。通常,我用 C++ 编写程序,所以这与仅仅说 string.empty() 有点不同。
我想知道在 C 中清空字符串的正确方法是什么。是这样吗?
缓冲区[80] = "你好世界!\n"; // ... strcpy(缓冲区,“”);【问题讨论】:
您的示例令人困惑。显然缓冲区已在其他地方声明,您尝试从文字初始化它。这里不需要清除任何东西。 string.empty() 不修改字符串 【参考方案1】:我是初学者,但是...据我所知,最好的方法是
strncpy(dest_string,"",strlen(dest_string));
【讨论】:
不要使用strncpy
geeksforgeeks.org/why-strcpy-and-strncpy-are-not-safe-to-use【参考方案2】:
如果你想为接收字符串的东西清除接收缓冲区,我发现最好的方法是如上所述使用 memset。原因是,无论下一个接收到的字符串有多大(当然限于 sizeof 缓冲区),如果写入一个已经预置零的缓冲区,它将自动成为一个 asciiz 字符串。
【讨论】:
【参考方案3】:需要字符串的名称和长度 将所有字符归零 其他方法可能会在遇到的第一个零处停止
void strClear(char p[],u8 len)u8 i=0;
if(len)while(i<len)p[i]=0;i++;
【讨论】:
【参考方案4】:另外两种方式是strcpy(str, "");
和string[0] = 0
要真正删除变量内容(如果您的脏代码不能与上面的 sn-ps 一起正常工作 :P ),请使用下面示例中的循环。
#include <string.h>
...
int i=0;
for(i=0;i<strlen(string);i++)
string[i] = 0;
如果您想从头开始清除动态分配的字符数组, 您可以使用 malloc() 和 memset() 的组合,或者 - 这样更快 - calloc() 与 malloc 执行相同的操作,但使用 Null 初始化整个数组。
最后,我希望您牢记您的运行时间。 更何况,如果您正在处理巨大的数组(6 位及以上),您应该尝试将第一个值设置为 Null,而不是通过整个字符串运行 memset()。
一开始它可能看起来更脏,但速度更快。你只需要更多地关注你的代码;)
我希望这对任何人都有用;)
【讨论】:
【参考方案5】:这取决于您所说的“空”是什么意思。如果您只想要一个长度为零的字符串,那么您的示例将起作用。
这也可以:
buffer[0] = '\0';
如果你想将字符串的全部内容归零,你可以这样做:
memset(buffer,0,strlen(buffer));
但这仅适用于清零到第一个 NULL 字符。
如果字符串是静态数组,可以使用:
memset(buffer,0,sizeof(buffer));
【讨论】:
澄清一下,如果buffer
是一个数组,最后一种方法将有效,但如果它是一个指针则无效。编译器必须能够看到数组的大小。如果buffer
是一个指针,它只会将指针的大小归零,可能是 4 或 8 个字节。
这个答案 - ***.com/a/56048617/3114742 - 说明永远不要使用 strlen
和 memset
- 只使用 sizeof
【参考方案6】:
取决于清空的含义。如果你只想要一个空字符串,你可以这样做
buffer[0] = 0;
如果要将每个元素都设置为零,请执行
memset(buffer, 0, 80);
【讨论】:
以上是关于清空 C 字符串的正确方法的主要内容,如果未能解决你的问题,请参考以下文章