c printf size_t

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)

pb2*_*b2q 9

在循环测试中,您希望测试*s1Copy非NULL,而不是*s1,您没有递增.实际上,既然*s1永远不会改变,你就会在字符串参数的末尾走,s1Copy++并且代码不会正常终止.

除非您传递空字符串:您的MyStrlen方法适用于空字符串.

while (*s1Copy)
    s1Copy++;
Run Code Online (Sandbox Code Playgroud)


Kei*_*son 5

这个:

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巧妙地诊断了你所看到的问题的实际原因(并打败了它!).

  • `z`长度修饰符的+1.我不知道_Why_大多数C编码员(除了可能没有选择的嵌入式开发人员)从20年前开始仍然停留在世界各地.来吧,加入我们,你知道你想:-) (3认同)