【问题标题】:Why does printing strlens not work for a int value? [closed]为什么打印 strlens 不适用于 int 值? [关闭]
【发布时间】:2021-02-12 17:17:38
【问题描述】:

但它适用于长数据类型?

例如

printf("%i", strlen("test")) -- errors 
printf("%li", strlen("test")) -- this works

【问题讨论】:

  • “int 错误”是什么意思?
  • 程序无法编译
  • strlen 函数返回一个size_t 类型的值,其正确的printf 格式是%zu。格式说明符和参数类型不匹配会导致未定义的行为
  • “无法编译”如何?你得到什么错误?请创建一个minimal reproducible example,然后将完整且完整的错误输出(作为文本)复制粘贴到问题正文中。另请告诉我们您是如何构建程序的。
  • 1) 不要将文字作为图片发布。 2) 错误信息有什么不清楚的地方?

标签: c string syntax


【解决方案1】:

strlen 不返回intlong,它返回size_t。在您的系统中,size_t 的大小似乎与 long 的大小相同。

但是,如果您要打印出带有printfsize_t,则应该使用%zu 来执行此操作。无论intlongsize_t 的相对大小如何,这都应该可以工作(在足够新的编译器上支持它)。在将%zu 添加到规范(例如,C89/90)之前,我们通常将size_t 转换为unsigned long,然后再将其打印出来(然后显然是使用%lu)。

【讨论】:

  • "在足够新的编译器上支持它" 注意 [c] 标签描述建议始终假定最新版本,除非另有说明
  • @GovindParmar:是的,这就是我把它放在括号中的原因。但是,仍然有足够多的 C89/90 编译器在使用,因此简单地忽略较旧的编译器是一个糟糕的主意(尤其是因为许多人不知道他们的编译器支持哪个版本的标准)。或者简单地说,标签描述的建议很差。
  • 您好,感谢您的回复我还有一个问题如何将 strlens 与数字进行比较?
  • @treeboy3:通常的方式是这样的:if (strlen(foo) < 3) ...(即,它只是一个数字,所以正常的比较是有效的——尽管你可能会收到关于混合有符号和无符号数字的警告,并且它们是合理的——如果你将它的回报与负数进行比较,你会得到奇怪的结果)。
  • 谢谢,我已经拿到了
【解决方案2】:

strlen 返回size_t,而不是intsize_t 是无符号类型; int 已签名。

传递与格式说明符不匹配的值是未定义的行为。 size_t 的正确格式说明符是 %zu。 (C 标准,§ 7.19.6.1:6)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    相关资源
    最近更新 更多