如何解决为什么在 printf 调用中将 size_t 类型的变量强制转换为无符号?
我正在编写一个程序并在此网站 http://www.cplusplus.com/reference/cstring/strlen/ 上查找 strlen() 函数。我看到在使用该函数的示例中,代码的作者将(无符号)将函数的结果强制转换为无符号。我知道这样做是因为函数返回 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
格式说明符的参数。
printf
的可变参数必须具有与说明符完全正确的类型,否则为 the behaviour is undefined。 %u
的参数类型是 unsigned
。
size_t
是一个 typedef,可能会也可能不会解析为 unsigned
,因此转换对于在所有平台上都定义良好的调用是必要的。
另一种方法是使用为 %zu
设计的 size_t
格式说明符,尽管这有一个实际问题,即如果库不符合 C99,它将失败。
这是为了便携性。 CREATE TABLE strings (id BINARY PRIMARY KEY,value BINARY);
INSERT OR REPLACE INTO strings (id,value) values ('dc906e6e69ed11e482ce87dc73eef410','00000000000000000000000060015866');
格式描述符有一个修饰符,使用字母 size_t
,如 z
(表示 %zu
操作数的无符号格式),它将接受 {{1 }} 参数,与您使用的架构无关。
根据您使用的 unix 风格和您遵循的标准,您会遇到以下系统,其中 size_t
被接受与否,size_t
存在与否(非常旧的系统有没有 z
类型)所以,由于 size_t
的结果可能被代码作者知道是短的,那么最便携的解决方案是将数据转换为 size_t
允许的类型{1}},然后使用已知的格式说明符。在您的情况下,作者决定使用 strlen()
,因为程序可能已从 32 位架构(有或没有 printf()
修饰符)更改为 64 位架构,但不知道它是否需要 {{1} } 或 (unsigned)
来指定结果。由于字符串足够短以适合 z
,因此无需使用 unsigned int
修饰符,该修饰符可能不为用户所知,或者不存在于她/他。
这很常见,因为在系统中应该为 unsigned long
、unsigned
、z
等保留一个字母。其中许多依赖于操作系统,并且未包含在标准中用户通常正在编程。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。