【发布时间】:2014-04-26 13:21:54
【问题描述】:
昨天我在面试时被要求在 C 中实现 strlen() 而不使用任何标准函数,全部手动完成。作为一个绝对的业余爱好者,我用 while 循环实现了原始版本。看着这个,我的面试官说它可以只用一行代码来实现。那时我无法使用该术语生成此代码。面试后我问了我的同事,他们中最有经验的给了我这篇文章,真的很好用:
size_t str_len (const char *str)
{
return (*str) ? str_len(++str) + 1 : 0;
}
所以有一个问题,是否可以不使用递归,如果可以,如何? 条款:
- 没有任何汇编程序
- 库中不存在任何 C 函数
- 不只是将几串代码拼在一起
请注意,这不是优化或实际使用的问题,只是完成任务的可能性。
【问题讨论】:
-
这可能更适合代码高尔夫
-
“一行”是一个相当宽松的要求。
-
能够在一行中实现 strlen() 是毫无意义的。我绝不会在面试或其他情况下要求任何人这样做。
-
@gnasher729:同意。再说一次,大多数面试“难题”问题都是毫无意义的,除非作为观察候选人思维方式的机会......假设他们还没有答案,在这种情况下,除了他们有一些答案之外,它什么也不会告诉你经验。
-
在 C++ 中你可以使用尾递归:
size_t strlen(const char *str, size_t acc = 0) { return *str ? strlen(str+1, acc + 1) : acc; }我猜 应该 编译成一个循环