C strlen()实现在一行代码中

Ale*_*lex 10 c algorithm strlen

昨天我在面试时被要求在C中实现strlen()而不使用任何标准函数,所有这些都是手工完成的.作为一个绝对的业余爱好者,我用while循环实现了原始版本.看看这个,我的面试官说它可以只用一行代码实现.我当时无法使用该术语生成此代码.在采访之后,我问了我的同事们,他们中最有经验的人给了我这件真的很好的作品:

size_t str_len (const char *str)
{
    return (*str) ? str_len(++str) + 1 : 0;
}
Run Code Online (Sandbox Code Playgroud)

所以有一个问题,是否可以不使用递归,如果是,如何?条款:

  • 没有任何汇编程序
  • 没有任何C函数存在于库中
  • 而不只是拼写一些代码串

请注意,这不是优化或实际使用的问题,只是完成任务的可能性.

Dig*_*uma 12

类似于@ DanielKamilKozar的答案,但是使用for循环,你可以在没有for-loop主体的情况下执行此操作,并len在函数中正确初始化:

void my_strlen(const char *str, size_t *len)
{
    for (*len = 0; str[*len]; (*len)++);
}
Run Code Online (Sandbox Code Playgroud)

  • 啊,非常聪明!如此明显. (2认同)
  • 那么`for(*len = 0;*str; ++ str,(*len)++);`?这样你就不必在每次迭代时取消引用`len`来索引到`str`. (2认同)
  • 这与 strlen 的签名不同。 (2认同)

Dan*_*zar 7

我能想到的最好的是这个,但它不是标准,strlen因为函数本身有不同的原型.此外,它假设*len在开始时为零.

void my_strlen(const char *str, size_t *len)
{
        while(*(str++)) (*len)++;
}
Run Code Online (Sandbox Code Playgroud)

我很好奇标准是如何strlen在"一行代码"中实现的,因为它需要一个return,即"一行代码",根据你发布的内容来判断.

也就是说,我同意评论说这是一个令人难以置信的愚蠢的面试问题.


Ale*_*tov 5

size_t str_len (const char *str)
{
    for (size_t len = 0;;++len) if (str[len]==0) return len;
}
Run Code Online (Sandbox Code Playgroud)

  • **+ 1**考虑到这个问题的含义是多么模糊,我认为,这是最好的答案:它保留了`strlen()`的功能和特征,并且它可以说是在一行中完成的. (2认同)