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

C strlen对字符串指针的计算不正确?,c,C,输出结果正确,显示为13字节。所以我认为这与for循环有关。我的猜测是:循环读取内容,但在执行过程中更新变量,即*str3++,一旦完成,就没有数据可读取,所有已经读取的数据都已读取并消失(呵呵)。。。这意味着0字节??就像读一本书,删掉你读到的最后一个字 如果是这种情况,我必须用数据重新填充它,请通过放置str3=“Final string.”重复初始化直接在for循环之后,它将显示正确的输出…但是…我觉得这是一个糟糕/廉价的把戏 我不太清楚到底发生了什么。请帮忙 提前谢谢 您将递增str指针

输出结果正确,显示为
13字节
。所以我认为这与
for
循环有关。我的猜测是:循环读取内容,但在执行过程中更新变量,即
*str3++
,一旦完成,就没有数据可读取,所有已经读取的数据都已读取并消失(呵呵)。。。这意味着
0字节
??就像读一本书,删掉你读到的最后一个字

如果是这种情况,我必须用数据重新填充它,请通过放置
str3=“Final string.”重复初始化直接在for循环之后,它将显示正确的输出…但是…我觉得这是一个糟糕/廉价的把戏

我不太清楚到底发生了什么。请帮忙


提前谢谢

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

您将指针向前移动到字符串的开始(初始化)处,直到它指向字符串的结尾。因此,当你调用strlen时,你得到的大小是0——在这一点上,它已经指向字符串的末尾 您应该使用一个辅助指针来迭代字符串-在迭代时推进它,而
strlen
命令将与原始
str3

您还可以在
for
正文中添加一个计数器,这样您就不必在结尾处调用
strlen


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

对于
循环,
str3
指向:

#include <stdio.h>
#include <string.h>
int main()
{
    char *str3;
    str3="Final string.";
    printf("%d bytes", strlen(str3));
    return 0;
}
printf("%c", *str3++);
for
循环中,您在
printf()中递增
str3
,直到
str3
命中空字符:

str3
 |
 V
+-+-+-+-+-+-+-+-+-+-+-+-+-+--+ 
|F|i|n|a|l| |s|t|r|i|n|g|.|\0|
+-+-+-+-+-+-+-+-+-+-+-+-+-+--+ 
因此,for循环
str3
之后指向:

#include <stdio.h>
#include <string.h>
int main()
{
    char *str3;
    str3="Final string.";
    printf("%d bytes", strlen(str3));
    return 0;
}
printf("%c", *str3++);
strlen()
通过终止空字符来确定字符串的长度。由于
str3
指向终止字符串的空字符,因此您将获得输出
0

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

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

其他:


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

str3++将递增指针,直到它指向字符串的末尾,因此长度将为0。为了避免这种情况,请复制所述指针,并让循环使用它。因为您将指针移动到字符串末尾的空终止符处。如果您让指针指向其他地方,那么令人惊讶的是,它将开始指向其他地方。添加语句
printf(“s3=%p\nstrlen(s3)=%zu\n”,(void*)s3,strlen(s3))到您的
for
循环,应该清楚发生了什么。
Final string.
13