【问题标题】:Whats wrong with this strlen() implementation? [closed]这个 strlen() 实现有什么问题? [关闭]
【发布时间】:2015-11-10 21:36:02
【问题描述】:
size_t strlen(const char* c)
{
  auto *c1 = c;
  while(*c1++);
  return c1 - c;
}

我能找到的错误:
* 缺少对 c 的 NULL 检查
* c1 应声明为 char 指针(或者是否需要?)
* 应该在返回之前将类型转换为size_t

【问题讨论】:

  • 您的问题到底是什么?您是否观察到不正确的行为?如果是这样,请告诉我们您看到了什么,以及您的预期。
  • while(*c1++); --> while(*c1) c1++;
  • 自动在 c 中工作吗?将您的标签更改为 c++ 或将 auto 更改为 char。
  • @RobertJacobs:它没有。
  • @RobertJacobs 这是一个 C++11 特性 IIRC,与 C 无关。这段代码有很多问题。

标签: c debugging strlen


【解决方案1】:
  1. 关闭 1:while(*c1++); --> while(*c1) c1++;

  2. “c1 应该声明为 char 指针(或者它是必需的吗?)”我会使用 const char *c1 = c;。需要检查 auto *c1 = c; 在 C11 中是否正常。
    [编辑] 也没有看到 auto 在 C11 中有效。推荐const char *c1 = c;

  3. “应在返回前转换为 size_t”。 return (size_t) (c1 - c); 是一个好主意,因为指针差异是 ptrdiff_t 类型(有符号整数类型)而 size_t 是无符号整数类型。这可以消除诸如 gcc -Wsign-conversion 之类的警告

  4. 不需要“对 c 进行 NULL 检查”,因为 strlen(const char* c) 需要指向字符串的指针,而 NULL 不是指向字符串的指针。

【讨论】:

  • 和 3."should typecast",不需要。 +1
  • 4. auto 在 C 中仍然是一个存储修饰符,不是用来自动推导变量类型的,不是吗?
  • 当你修改你的答案说演员表是一个好主意时,你能说为什么添加一个无用的演员表是个好主意吗?
  • @ouah 添加一个无用的演员表不好。然而,海事组织,不是一个无用的演员。由于ptrdiff_t 是有符号类型,因此转换为无符号类型size_t 可以消除迂腐警告。
  • @chux 好的,我的 gcc 版本有一个 -Wextra,其中不包括 -Wsign-conversion,这无论如何都是异端恕我直言。
【解决方案2】:

看起来您的答案总是多于应有的 1。你需要减1或者return c1 - c - 1;

【讨论】:

  • 分析正确,但解决方法不正确。
  • @ouah。当我测试它时工作。为什么它不起作用?
  • 有点误读你的答案对不起,+1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-17
  • 2011-09-28
  • 2011-12-14
  • 2017-08-05
  • 1970-01-01
相关资源
最近更新 更多