-3

我的代码编译,虽然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;
}
4

2 回答 2

9

在您的循环测试中,您想要测试*s1Copy非 NULL,not *s1,您不会增加它。实际上,由于*s1永远不会更改,因此您将直接从字符串参数的末尾走出来,s1Copy++并且代码不会正常终止。

当然,除非您传递空字符串:您的MyStrlen方法适用于空字符串。

while (*s1Copy)
    s1Copy++;
于 2012-07-24T03:34:37.540 回答
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 巧妙地诊断出您所看到的问题的实际原因(并击败了我!)。

于 2012-07-24T03:48:28.663 回答