【问题标题】:Simplify string iteration简化字符串迭代
【发布时间】:2017-04-20 23:23:40
【问题描述】:

我刚刚开始学习编码(特别是 C)。 在编写一个计算数组字符以用于学习目的的函数时,我在质疑自己(我对此非常确定),是否有可能简化此迭代:

int stringlength(char* s)
{
    int i = 0;

    while (s != NULL && *(s + i) != '\0')
        i++;

    return i;
}

我想将i++ 保留在迭代本身中(for 循环?)。

我很感激你们给我的任何暗示。如果您发现我做错的无关问题 - 请告诉我。

【问题讨论】:

  • 您可以将s != NULL的检查提取到函数开头的if条件
  • 请注意,名称以strx 开头的函数(其中x 是小写字母)是个坏主意,因为整个名称空间都为标准库保留。这个特殊的函数应该是安全的,尽管我们已经有了strlen()。 :)
  • 感谢您的提示 :) 考虑提取 {s != NULL},我是否仅出于性能原因提取此检查(不检查数组的每个字符是否相同)?

标签: c loops


【解决方案1】:
if(s == NULL)
    return 0;
int i;
for(i = 0; s[i] != '\0'; i++);

我相信这应该可以解决你的目的。

编辑:为输入 char* 添加 NULL 检查,因为 NULL 可能是一个可能的值。

【讨论】:

    【解决方案2】:
    int stringlength(char* s)
    {
        if (!s) 
           return 0;
        int i = -1;
        while(s[++i]!='\0');
        return i;
    }
    

    【讨论】:

    • 请不要发布裸代码答案,还请提供一些关于您的代码在做什么的评论。
    【解决方案3】:

    我测试了strlen(NULL)glibc,它导致Segment Fault,我认为导致Segment Fault 是合理的。所以这是我的实现:

    #include <assert.h>
    
    int stringlength(const char* s) {
        assert(s != NULL);
        int i;
        for (i = 0; s[i]; ++i);
    
        return i;
    }
    

    注意:sconst char *,但不是 char *

    【讨论】:

      【解决方案4】:

      我建议使用指针算法。

      首先,处理NULL 情况(空字符串,因此您只能得到空终止符)。否则,迭代指针并递增计数器。然后,只需返回该计数器。

      int stringlength(char* s)
      {
         if (!s) return 0;
         int len = 0;
      
         while (*s++) len++;
      
         return len;
      }
      

      (*s++) 有什么魔力? 那么这相当于 *(s++) != 0。但是因为++ 的优先级高于*,所以括号没有用。

      另外,你可以看看这个thread

      【讨论】:

      • 非常感谢。你能告诉我为什么创建源指针的副本是有用/必要的吗?另外,如果您有时间再解释一下,在这种情况下,“while”的工作条件究竟如何? *cp++ 正在检查字符串中的“下一个”字符,但如果我不检查“\0”,为什么条件 (*cp++) 会结束?
      • @hiimvinzent 我将编辑回复。确实,这里不需要副本。
      • @YassineHoussni:你试过了吗?
      • 我在没有复制的情况下编译了它,但使用了这个迭代,它对我来说很好。由于我只是检查值而不是更改它,因此我认为不需要复制。
      猜你喜欢
      • 2014-04-21
      • 2012-10-23
      • 2011-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-13
      相关资源
      最近更新 更多