#include <stdio.h>
#include <string.h>
int main()
{
    char *str3;
    str3="Final string.";
    for(;*str3;)
    {
        printf("%c", *str3++);
    }
    printf("\n");
    printf("%d bytes", strlen(str3));

    return 0;
}


我一直对为什么输出在应显示0 bytes时为何显示13 bytes感到困惑。我像这样删除了for循环:

#include <stdio.h>
#include <string.h>
int main()
{
    char *str3;
    str3="Final string.";
    printf("%d bytes", strlen(str3));
    return 0;
}


然后输出正确输出13 bytes。因此,我认为它与for循环有关。我的猜测是:循环读取内容,但随着变量的进行更新,即*str3++,一旦完成,就没有要读取的数据了,所有已读取的数据都被读取并消失了(呵呵) ...这意味着0 bytes ??就像读一本书,浪费你读的最后一个单词一样。

如果是这种情况,我必须用数据重新填充它,可以直接在for循环后放置str3="Final string.";来进行重复初始化,它将显示正确的输出...但是...我觉得那很不好/把戏?

我不太确定发生了什么。请帮忙。

提前致谢!!

最佳答案

for循环之前,str3指向:

str3
 |
 V
+-+-+-+-+-+-+-+-+-+-+-+-+-+--+
|F|i|n|a|l| |s|t|r|i|n|g|.|\0|
+-+-+-+-+-+-+-+-+-+-+-+-+-+--+


for循环中,您要在str3中递增printf(),直到str3达到空字符:

printf("%c", *str3++);


因此,在for循环之后,str3指向:

                          str3
                           |
                           V
+-+-+-+-+-+-+-+-+-+-+-+-+-+--+
|F|i|n|a|l| |s|t|r|i|n|g|.|\0|
+-+-+-+-+-+-+-+-+-+-+-+-+-+--+


strlen()通过终止空字符来确定字符串的长度。由于str3指向终止字符串的空字符,因此您将获得输出0

您可以采用另一个指针并将其指向str3并在for循环中使用它,如下所示:

#include <stdio.h>
#include <string.h>
int main()
{
    char *str3, *tmp;
    str3="Final string.";
    tmp=str3;
    for(;*tmp;)
    {
        printf("%c", *tmp++);
    }
    printf("\n");
    printf("%zu bytes", strlen(str3));

    return 0;
}


输出:

Final string.
13




额外:

strlen()返回类型为size_t。您应该使用格式说明符%zu来打印strlen返回值。

关于c - strlen对于字符串指针的计算不正确?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48684550/

10-11 18:42