清空 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 - 说明永远不要使用 strlenmemset - 只使用 sizeof【参考方案6】:

取决于清空的含义。如果你只想要一个空字符串,你可以这样做

buffer[0] = 0;

如果要将每个元素都设置为零,请执行

memset(buffer, 0, 80);

【讨论】:

以上是关于清空 C 字符串的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

C语言中 如何把字符串中某一位清空?

如何在Javascript中正确清空元素?

如何在Arduino c语言中清空字符串

怎么用memset清空字符数组?

怎么用memset清空字符数组?

复制C字符串的正确方法