#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/