【问题标题】:Best way to check if a character array is empty检查字符数组是否为空的最佳方法
【发布时间】:2010-12-20 02:45:30
【问题描述】:

检查字符数组是否为空最可靠的方法是什么?

char text[50];

if(strlen(text) == 0) {}

if(text[0] == '\0') {}

或者我需要这样做

 memset(text, 0, sizeof(text));
 if(strlen(text) == 0) {}

最有效的方法是什么?

【问题讨论】:

  • 所以您想知道是否需要测试 null 或者是否需要将字符串设置为全 0 然后测试 0?
  • 是的,如果我只是声明一个字符串并且没有先对它做任何事情,我不确定是否可以将它测试为 NULL。

标签: c arrays null char


【解决方案1】:

鉴于此代码:

char text[50];
if(strlen(text) == 0) {}

接着是关于此代码的问题:

 memset(text, 0, sizeof(text));
 if(strlen(text) == 0) {}

我闻到混乱的味道。具体来说,在这种情况下:

char text[50];
if(strlen(text) == 0) {}

...text[] 的内容将未初始化和未定义。因此,strlen(text) 将返回未定义的结果。

确保将 C 字符串初始化为空字符串的最简单/最快的方法是简单地将第一个字节设置为 0。

char text[50];
text[0] = 0;

从那时起,strlen(text) 和非常快速但不直接的(text[0] == 0) 测试都将检测到空字符串。

【讨论】:

  • 我的结构很糟糕,我的意思是 memset(text, 0, sizeof(text));紧跟在 char text[50] 之后;因为我不确定在分配任何内容之前对 char 数组进行 strlen 是否是不好的做法。
  • 在分配数组之前对数组进行 strlen 肯定是个坏主意 - strlen 将在内存中前进,直到达到 0 字节,这可能远远超出数组的末尾。
【解决方案2】:

取决于您的数组是否包含以空字符结尾的字符串。如果是的话,那么

if(text[0] == '\0') {}

应该足够了。

编辑:另一种方法是......

if (strcmp(text, "") == 0)

这可能效率较低,但清楚地表达了您的意图。

【讨论】:

  • 对我来说,以下是有效的 if(text[0]==''){return false;} return true;
【解决方案3】:

这将用于查找字符数组是否为空。它可能也是最快的。

if(text[0] == '\0') {}

如果text 数组为空,这也会很快。如果它包含字符,则需要先计算其中的所有字符。

if(strlen(text) == 0) {}

【讨论】:

  • 不要使用 strlen 来测试 cstring 是否为空。这不是一个恒定的时间操作。
  • 这是我在答案中解释的。
【解决方案4】:

第二种方法几乎肯定是测试一个以 null 结尾的字符串是否为空的最快方法,因为它涉及一次读取和一次比较。在这种情况下,这种方法肯定没有错,所以你不妨使用它。

第三种方法不检查字符数组是否为空;它确保字符数组为空。

【讨论】:

    【解决方案5】:

    第二个最快。使用strlen 将关闭如果字符串确实为空,但strlen 将始终遍历字符串的每个字符,所以如果它为空,它将完成比您需要的更多的工作。

    正如詹姆斯所说,第三个选项在检查之前会擦除字符串,因此检查总是会成功但没有意义。

    【讨论】:

      【解决方案6】:
      if (text[0] == '\0')
      {
          /* Code... */
      }
      

      如果您正在为闪存和/或 RAM 上空间很小的微控制器进行编码,请使用此选项。与检查第一个字节相比,使用strlen 会浪费很多更多的闪存。

      上面的例子是最快的,需要更少的计算。

      【讨论】:

        【解决方案7】:
        if (!*text) {}  
        

        上面取消引用指针'text'并检查它是否为零。或者:

        if (*text == 0) {} 
        

        【讨论】:

          猜你喜欢
          • 2011-05-30
          • 2013-02-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-30
          • 1970-01-01
          相关资源
          最近更新 更多