bli*_*eus -3 c string printf size-t
我的代码编译,虽然printf没有显示任何内容?
如果我取出格式化程序部分,printf那么它的工作正常.
#include <stdio.h>
size_t MyStrlen(const char *s1)
{
const char *s1Copy = s1;
while (*s1)
{
*s1Copy++;
}
return s1Copy -s1;
}
int main(void)
{
const char str[] = "HELLO";
printf("Length: %d \n", (unsigned int)MyStrlen(str));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在循环测试中,您希望测试*s1Copy非NULL,而不是*s1,您没有递增.实际上,既然*s1永远不会改变,你就会在字符串参数的末尾走,s1Copy++并且代码不会正常终止.
除非您传递空字符串:您的MyStrlen方法将适用于空字符串.
while (*s1Copy)
s1Copy++;
Run Code Online (Sandbox Code Playgroud)
这个:
printf("Length: %d \n", (unsigned int)MyStrlen(str));
Run Code Online (Sandbox Code Playgroud)
好的 %d期望一个int参数,但它保证int并且unsigned int具有两者范围内的值的相同表示.这个:
printf("Length: %u\n", (unsigned int)MyStrlen(str));
Run Code Online (Sandbox Code Playgroud)
更好,因为%u期待一个unsigned int论点.
正确的格式size_t是"%zu":
printf("Length: %zu\n", MyStrlen(str));
Run Code Online (Sandbox Code Playgroud)
但这是C99中的"新"功能,可能仍有一些实现不支持它.(特别是,Microsoft支持C99的速度非常慢.)为了获得最大的可移植性(假设您的字符串长度不超过2 32 -1个字节),您可以使用:
printf("Length: %lu\n", (unsigned long)MyStrlen(str));
Run Code Online (Sandbox Code Playgroud)
这回答了你问的问题printf; pb2q巧妙地诊断了你所看到的问题的实际原因(并打败了它!).