使用printf输出strlen返回值时出现需将%d改为%I64d的警告如何解决
警告产生原因
strlen 函数的返回值类型是标准库定义的 size_t,这是一种无符号整数类型,位宽和平台寻址能力保持一致:32位系统下为32位无符号数,64位系统下为64位无符号数,专门用于表示内存长度、对象大小这类非负的长度值。
你代码中使用的 %d 是匹配有符号 int 类型的格式符,而 int 在绝大多数环境下(包括64位系统)均为32位有符号数,和 size_t 类型不匹配,属于C标准规定的未定义行为,运行时可能出现输出错误。你当前应该是在64位Windows环境下编译,size_t 是64位无符号类型,所以编译器会提示你用Windows平台特有的 %I64d 适配64位整数。
正确处理方案
- 优先使用C标准规定的
size_t专属格式符%zu。这是C99及之后标准引入的跨平台通用格式符,完美匹配size_t类型,现在绝大多数主流编译器都支持该标准,是兼容性和规范性最好的方案,修改后代码如下:
char string[DIM] = "hello"; printf("%zu", strlen(string));
- 如果必须兼容C89等不支持
%zu的旧标准,可以显式将返回值强制转换为匹配格式符的类型:如果确认字符串长度不会超过int取值范围,可以转成int配合%d使用:
printf("%d", (int)strlen(string));
如果是Windows环境下需要适配64位长度,建议配合无符号格式符 %I64u 使用(size_t 是无符号类型,用有符号的 %I64d 仍然存在类型不匹配的问题,长度超过有符号数上限时会输出错误):
printf("%I64u", (unsigned long long)strlen(string));
内容的提问来源于stack exchange,提问作者Tenko
相关产品推荐
相关产品推荐

