我的代码会编译,但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;
}
答案 0 :(得分:9)
在循环测试中,您希望测试*s1Copy
是非NULL,而不是*s1
,而不是递增。实际上,由于*s1
永远不会改变,所以你正在使用s1Copy++
走到字符串参数的末尾,并且代码不会正常终止。
除非你传递空字符串:你的MyStrlen
方法将用于空字符串。
while (*s1Copy)
s1Copy++;
答案 1 :(得分:5)
此:
printf("Length: %d \n", (unsigned int)MyStrlen(str));
没问题; %d
期望int
参数,但保证int
和unsigned int
对两者范围内的值具有相同的表示形式。这样:
printf("Length: %u\n", (unsigned int)MyStrlen(str));
更好,因为%u
需要unsigned int
参数。
size_t
的正确格式为"%zu"
:
printf("Length: %zu\n", MyStrlen(str));
但这是C99中的“新”功能,可能仍有一些实现不支持它。 (特别是,Microsoft支持C99的速度非常慢。)为了获得最大的可移植性(假设你的字符串长度不超过2 32 -1个字节),你可以使用它:
printf("Length: %lu\n", (unsigned long)MyStrlen(str));
这回答了您提出的关于printf
的问题; pb2q巧妙地诊断出你遇到的问题的实际原因(并打败了我!)。