0

我在理解这段代码时遇到了一些麻烦。为什么长度是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();
}
4

4 回答 4

1

不仅长度减 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()也许这只是一个练习?

于 2013-02-14T06:26:21.063 回答
0

++s在评估它之前增加值。这就是为什么你的答案比实际长度少一。使用s++.

于 2013-02-14T06:08:40.820 回答
0

++s是前缀增量,因此循环实际上将从第二个字符开始。最短的解决方法是将其更改为后缀增量:

while(*(s++) != '\0')

或者:

while(*s++)
于 2013-02-14T06:09:04.710 回答
0

读了几次问题后,我明白“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;
于 2013-02-14T06:12:31.903 回答