c - 为什么在 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;
}
解决方案
在代码示例中,这是因为它是对应于%u
格式说明符的参数printf
。
for 的可变参数printf
必须具有完全正确的说明符类型,否则行为是 undefined。的参数类型%u
是unsigned
。
size_t
是一个 typedef ,可能会或可能不会解析为unsigned
,因此要在所有平台上明确定义调用,强制转换是必要的。
另一种方法是使用%zu
为 设计的格式说明符size_t
,尽管这有一个实际问题,即如果库不符合 C99,它将失败。
推荐阅读
- rust - 当结构具有异步方法时,如何指定 Rust 结构字段必须满足特征?
- python - 无法使用 Flask 将数据传递到第三种形式
- wagtail - 如何在 wagtail 管理员中动态重新加载 watail_hooks.py?
- python - Python 可以根据条件设置不同的命令行参数吗?
- python - 遍历两个列表并根据列表中的子字符串连接
- build - 编译android模拟器导致grpc丢失
- google-sheets - 基于单词中字符位置的条件格式 - Google 表格
- html - 如何不间断地从下到上为 div 设置动画?
- python-3.x - 计算 Z 分数时出错
- java - Java Spring在数据库触发后继续执行