strlen对字符串指针的计算不正确?

时间:2018-02-08 11:36:15

标签: c

#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++,一旦它完成,那里没有数据可供读取,所有已经读取的数据好吧, read&amp; (呵呵)......这意味着0 bytes ??就像读一本书,把你读到的最后一个字剔除一样。

如果是这种情况我不得不用数据重新填充,请在for循环后直接放置str3="Final string.";进行重复初始化,然后它会显示正确的输出。但是......我觉得这是一个糟糕/便宜的伎俩?

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

提前致谢!!

3 个答案:

答案 0 :(得分:4)

for循环之前,str3指向:

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

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

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

因此,for for循环str3指向:

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

strlen()通过终止null-character来确定字符串的长度。由于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返回的值。

答案 1 :(得分:1)

您正在递增str指针,直到它指向0(字符串的结尾),当您调用strlen(str3)时,它返回0.

答案 2 :(得分:0)

您正在将指针指向字符串的开始(初始化),直到它指向字符串的结尾。因此,当你在它上面调用strlen时,你得到0大小 - 此时它已经指向字符串的结尾 你应该使用辅助指针迭代字符串 - 在迭代时推进它,而strlen命令将与原始str3

一起使用

您还可以在for正文中添加一个计数器,这样可以节省您在结束时拨打strlen的需要

在你的情况下,字符串是文字的,不需要被释放,但是当动态分配字符串时,使用辅助指针是必须的。 - 必须使用原始指针(从分配返回)释放已分配的内存