#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.";
进行重复初始化,然后它会显示正确的输出。但是......我觉得这是一个糟糕/便宜的伎俩?
我不确定发生了什么。请帮忙。
提前致谢!!
答案 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
的需要
在你的情况下,字符串是文字的,不需要被释放,但是当动态分配字符串时,使用辅助指针是必须的。 - 必须使用原始指针(从分配返回)释放已分配的内存