c printf size_t

时间:2012-07-24 03:31:09

标签: 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;
}

2 个答案:

答案 0 :(得分:9)

在循环测试中,您希望测试*s1Copy是非NULL,而不是*s1,而不是递增。实际上,由于*s1永远不会改变,所以你正在使用s1Copy++走到字符串参数的末尾,并且代码不会正常终止。

除非你传递空字符串:你的MyStrlen方法用于空字符串。

while (*s1Copy)
    s1Copy++;

答案 1 :(得分:5)

此:

printf("Length: %d \n", (unsigned int)MyStrlen(str));

没问题; %d期望int参数,但保证intunsigned 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巧妙地诊断出你遇到的问题的实际原因(并打败了我!)。