gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:57:18 25 4
gpt4 key购买 nike

#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;
}

我一直很困惑,为什么输出应该显示 13 字节,而却显示 0 字节。我删除了 for 循环,如下所示:

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

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

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

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

提前致谢!!

最佳答案

for循环之前,str3指向:

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

for 循环中,您将在 printf() 中递增 str3 直到 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com