我在理解这段代码时遇到了一些麻烦。为什么长度是3?如果我输入hi
,长度为1。
#include <stdlib.h>
#include <stdio.h>
int len(char *s)
{
int i = 0;
while(*(++s) != '\0')
i++;
printf("%d", i);
return i;
}
int main()
{
len("this");
getchar();
}
不仅长度减 1,而且如果你给它一个空字符串作为你希望它返回 0 的参数,你最终可能会遇到访问冲突(尽管大多数时候你不会因为零bytes 在未初始化的内存中很常见)或随机数(基本上它将返回存储在 c-string 空字符串常量后面 1 个字节的非零字节数。
长度减 1,因为您使用的是前缀增量运算符,它被评估为该行中的第一件事:
while(*(++s)!='\0')
具体来说,如果你看看你在那里做什么,长手,它会这样写:
char *s = "this";
int i = 0;
while (1) {
s = s + 1;
if (*s == '\0') break;
i++;
}
printf("%d", i);
...
你看到问题了吗? ++s
首先增加指针。所以你跳过你的字符串的第一个字母。
无论如何,你可能想要的是这样的:
int len(const char *s) {
int clen = 0;
while (*s++ != '\0') clen++;
return clen;
}
当然,有人可能会问,当您拥有标准 C 库时strlen()
,为什么要重新发明轮子。strnlen()
也许这只是一个练习?
++s
在评估它之前增加值。这就是为什么你的答案比实际长度少一。使用s++
.
++s
是前缀增量,因此循环实际上将从第二个字符开始。最短的解决方法是将其更改为后缀增量:
while(*(s++) != '\0')
或者:
while(*s++)
读了几次问题后,我明白“len”的函数对于长度为2的字符串(如'hi')返回1
这是因为以下行:while (*(++s)!='\0')
剖析条件导致以下语句(只是为了清楚您的代码会发生什么,当然这不是应该这样做的)
startover:
s = s + 1;
if (*s != '\0') goto end;
i = i + 1;
goto startover;
如您所见,在开始计数之前,您总是越过第一个字符。您可以改为使用来避免这种情况s++
。这将在检查 '\0' 之后移动 s 的修改:
startover:
if (*s != '\0') goto end;
s = s + 1;
i = i + 1;
goto startover;