首页 > 解决方案 > 为什么在 printf 调用中将 size_t 类型的变量强制转换为(无符号)?

问题描述

我正在编写一个程序并在这个网站http://www.cplusplus.com/reference/cstring/strlen/上查找 strlen() 函数。我看到在使用函数的示例中,代码的作者 put (unsigned) 将函数的结果强制转换为无符号。我知道这样做是因为函数返回 size_t 类型,它是无符号的,但这真的有必要吗?

/* strlen example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char szInput[256];
  printf ("Enter a sentence: ");
  gets (szInput);
  printf ("The sentence entered is %u characters long.\n",(unsigned)strlen(szInput));
  return 0;
}

标签: cunsignedstrlen

解决方案


在代码示例中,这是因为它是对应于%u格式说明符的参数printf

for 的可变参数printf必须具有完全正确的说明符类型,否则行为是 undefined。的参数类型%uunsigned

size_t是一个 typedef ,可能会或可能不会解析为unsigned,因此要在所有平台上明确定义调用,强制转换是必要的。

另一种方法是使用%zu为 设计的格式说明符size_t,尽管这有一个实际问题,即如果库不符合 C99,它将失败。


推荐阅读