【问题标题】:How to empty a char array?如何清空一个字符数组?
【发布时间】:2010-12-06 06:43:12
【问题描述】:

有一个字符数组,如 char 成员 [255]。如何在不使用循环的情况下完全清空它?

char members[255];

“空”是指如果它存储了一些值,那么它不应该。例如,如果我执行 strcat,则不应保留旧值

members = "old value";

//empty it efficiently
strcat(members,"new"); // should return only new and not "old value new"

【问题讨论】:

  • “清空数组”是什么意思?
  • members[0]=members[1]=members[2]=members[3]...=members[255]=0 没有循环 ;)
  • 所以你的“数组”是一种特殊的数组:它是一个string。要“清空”字符串,请将其第一个元素设置为 '\0':members[0] = '\0';
  • 社区似乎支持 memset。但考虑到我的要求,这是最有效的方法吗?
  • @Alex Xander:在这种情况下,“社区”显然是错误的。在某些情况下需要“memset”(例如清除数据以防止未经授权的使用),但对于简单的字符串重置(如您的情况),正确的答案是仅将第一个元素归零。

标签: c arrays char


【解决方案1】:

使用

  memset(members, 0, 255);

一般

  memset(members, 0, sizeof members);

如果数组在范围内,或者

  memset(members, 0, nMembers * (sizeof members[0]) );

如果你只有指针值,而 nMembers 是数组中的元素个数。


编辑当然,现在要求已经从清除数组的一般任务更改为纯粹重置字符串,memset 太过分了,只需将第一个元素归零就足够了(如其他答案中所述)。


编辑为了使用memset,你必须include string.h

【讨论】:

  • +1 - 我会这样做,因为它可以确保所有数组元素都处于已知状态。
  • 它违背了不使用循环的(史诗)要求。
  • 虽然 memset 可能不是作为递归实现的,但它可能是 -- 在任何一种情况下,迭代都很好地隐藏在视线之外,这是表面上的要求。
【解决方案2】:

取决于你所说的“空”:

members[0] = '\0';

【讨论】:

  • 这只会改变 members[0] 的值,而不是 members[1] 到 members[254]。如果您按顺序访问很好......但在其他情况下就不那么好了。
  • 在 OP 的编辑之后,我的解决方案似乎应该满足他的要求,因为 strcat() 会找到 NULL 字节并相应地处理它。
  • 不是更好的解决方案。只是解决不同问题的方法。
  • 没有办法在 C 中“清空”一个抽象数组。每个数组都包含一些东西,即使它是零。 “清空数组”的概念仅适用于数组内容的高级逻辑解释。例如,数组的内容可能被解释为 C 字符串。在这种情况下,“清空”的正确方法是将第一个元素设置为 '\0'。正是菲利克斯所做的。我不知道 OP 可能会想到什么其他解释,但如果没有更具体地说明,所有使用“memset”的尝试都只是对无意义问题的无意义答案。
  • @tinkertim:这里没有 NULL。不,'strcat' 不知道如何处理 NULL。如果您将 NULL 传递给它,它将崩溃。
【解决方案3】:

如果您正在处理字符串,请不要费心尝试将您的 char 数组归零。下面是使用 char 字符串的简单方法。

复制(分配新字符串):

strcpy(members, "hello");

连接(添加字符串):

strcat(members, " world");

空字符串:

members[0] = 0;

就这么简单。

【讨论】:

    【解决方案4】:

    字符成员[255] = {0};

    【讨论】:

    • 不行,因为他没有指定必须在初始化后进行。尤其是他在编辑之前的第一个示例可能已经理解了这一点,因为清除数组也是非常常见的用例。
    • 我给你+2作为他给你-1的补偿 :P :D
    【解决方案5】:

    编辑:鉴于对问题的最新编辑,这将不再有效,因为没有空终止 - 如果您尝试打印数组,您会让你的字符后跟一些非人类可读的字符。但是,我将把这个答案留在这里作为社区 wiki 供后代使用。

    char members[255] = { 0 };
    

    应该可以。根据C编程语言:

    如果数组有固定大小,初始化器的数量不能超过数组的成员数;如果数量较少,则剩余成员初始化为 0。

    这意味着数组的每个元素的值都是 0。我不确定这是否是您认为“空”的值,因为 0 是 char 的有效值。

    【讨论】:

    • 这取决于你如何定义“空”。值为 0 的字符不是人类可读的字符,并且字符数组处于已知状态。我会认为那是空的。它也和 memset 做同样的事情(如果我对 memset 的记忆是正确的——我已经很久没有使用 C 语言了)。
    【解决方案6】:

    使用bzero(array name, no.of bytes to be cleared);

    【讨论】:

      【解决方案7】:

      你不能像这样清空一个数组,它总是包含相同数量的数据。

      在更大的上下文中,数组中的数据可能表示一个空的项目列表,但必须在数组之外进行定义。最常见的方法是保留有效项目的计数(参见 pmg 的答案)或让字符串以零字符终止它们(Felix 的答案)。还有更复杂的方法,例如环形缓冲区使用两个索引来表示添加和删除数据的位置。

      【讨论】:

        【解决方案8】:
        members[0] = 0;
        

        足够了,考虑到您的要求。

        请注意,这并不是“清空”缓冲区。内存仍然被分配,有效的字符值可能仍然存在,等等..

        【讨论】:

        • 也可以写成*members = 0;
        • 即使0 也是有效字符。我们不知道members 是否被视为C 字符串。
        【解决方案9】:

        我会去的

        members_in_use = 0;
        

        【讨论】:

        • 这实际上很有意义,因为 OP 要求的操作(清空)不是 C 数组的一部分 - 因此,理想情况下,他会实现一个新的数据结构,并且pmg 表示结构为空的方式已经足够好了。
        • 不,真的没有任何意义。
        • Kinopiko:显然你当时不了解这种方法
        • Kinopiko:阅读 starblue 的答案,因为它比我在评论中解释的更好地解释了我的推理(谢谢 starblue)
        • 嗯,这是一个有趣的方法,members_in_use 仍然是一个数组吗?我以后可以做一个吗? member_in_use[5] = 价值?这是否等同于 memset(members_in_use, 0, 255);正如史蒂夫所说?如果是这样,为什么要使用一个而不是另一个?
        【解决方案10】:

        如果您的意思是重置为 0,“清空数组”,那么您可以使用 bzero。

        #include <strings.h>  
        void bzero(void *s, size_t n);  
        

        如果你想用一些其他默认字符填充数组,那么你可以使用 memset 函数。

        #include <string.h>  
        void *memset(void *s, int c, size_t n);  
        

        【讨论】:

        • bzero 和 memset(通常)都使用循环。
        【解决方案11】:

        在这种情况下,members[0] = 0 有效。

        【讨论】:

          【解决方案12】:

          免责声明:我通常不使用 C 编程,因此我的示例中可能存在任何语法问题,但我希望我试图表达的想法是清晰的。

          如果“emptying”的意思是“包含一个空字符串”,你可以将第一个数组项赋值为零,这将有效地使数组包含一个空字符串:

          members[0] = 0;
          

          如果“清空”的意思是“释放正在使用的内存”,那么您首先不应该使用固定的 char 数组。相反,您应该定义一个指向 char 的指针,然后根据需要执行 malloc / free(或字符串分配)。

          仅使用静态字符串的示例:

          char* emptyString="";
          char* members;
          
          //Set string value
          members = "old value";
          
          //Empty string value
          member = emptyString
          
          //Will return just "new"
          strcat(members,"new");
          

          【讨论】:

            【解决方案13】:

            您可以使用以下指令:

            strcpy_s(members, "");
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-04-05
              • 2013-11-28
              • 2020-01-10
              • 2015-12-06
              • 2011-04-04
              • 2019-09-04
              相关资源
              最近更新 更多