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