如何将“zd”说明符与“printf()”一起使用?

2024-01-07

寻求有关使用的说明"zd" with printf().

当然,对于 C99 及更高版本,以下内容是正确的。

void print_size(size_t sz) {
  printf("%zu\n", sz);
}

C 规范seems允许printf("%zd\n", sz)取决于它的阅读方式:

7.21.6.1fprintf功能

z指定以下d, i, o, u, x, or X转换说明符适用于size_t或相应的有符号整数类型参数;或者以下n转换说明符适用于指向对应于有符号整数类型的指针size_t争论。 C11dr §7.21.6.1 7

这应该被理解为

  1. "z指定以下d...转换说明符适用于size_t或相应的有符号整数类型参数...“(两种类型)和”z指定以下u...转换说明符适用于size_t或相应的有符号整数类型参数...”(两种类型)

OR

  1. "z指定以下d...转换说明符适用于相应的有符号整数类型参数..."(仅限有符号类型)和"z指定以下u...转换说明符适用于size_t“(仅限无符号类型)。

我一直在使用#2 定义,但现在不太确定。

哪个是正确的,1、2 还是其他?

如果 #2 是正确的,那么可以使用的类型示例是什么"%zd"?


printf with a "%zd"格式需要一个与无符号类型对应的有符号类型的参数size_t.

标准 C 没有提供这种类型的名称,也没有提供确定它是什么的好方法。如果size_t是一个类型定义unsigned long,例如,那么"%zd"需要一个类型参数long,但这不是一个可移植的假设。

该标准要求相应的有符号和无符号类型对两种类型中可表示的非负值使用相同的表示形式。脚注表示,这意味着它们可以作为函数参数互换。所以这:

size_t s = 42;
printf("s = %zd\n", s);

应该可以工作,并且应该打印“42”。它将解释该值42,无符号类型size_t,就好像它是相应的有符号类型。但确实没有充分的理由这样做,因为"%zu"也是正确且定义良好的,无需诉诸额外的语言规则。和"%zu"效劳于all类型的值size_t,包括那些超出相应有符号类型范围的。

最后,POSIX定义了一个类型ssize_t在标题中<unistd.h> http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/unistd.h.html and <sys/types.h> http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_types.h.html。尽管 POSIX 没有明确说明,但很可能是这样ssize_t将是对应于的有符号类型size_t。 因此,如果您正在编写 POSIX 特定的代码,"%zd"(可能)是打印 type 值的正确格式ssize_t.

更新:POSIX明确地说 https://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xsh_chap02.html that ssize_t isn't必然是签名版本size_t,因此编写假设它是的代码是不明智的:

ssize_t

这是一个有符号的模拟size_t。措辞是这样的 实现可以选择使用更长的类型或 只是使用底层类型的签名版本size_t。 所有返回的函数ssize_t (read() and write())描述为 “实现定义的”输入结果超过 {SSIZE_MAX}。 人们认识到,某些实现可能有int是 小于size_t。符合要求的应用程序将受到限制 以大于 { 的片段执行 I/OSSIZE_MAX},但是符合 使用扩展的应用程序将能够使用整个范围,如果 该实施提供了扩展的范围,同时仍然具有 单一类型兼容的接口。符号size_t and ssize_t是 还需要在<unistd.h>最大限度地减少调用所需的更改 到read() and write()。提醒实施者必须 可能同时包括两者<sys/types.h> and <unistd.h>在相同的 程序(无论顺序)没有错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将“zd”说明符与“printf()”一起使用? 的相关文章

随机推荐

  • 使用 Interface Builder 检测 UIView 上的触摸

    如何检测触摸UIviewController for a UIView仅使用代码 没有 Interface Builder 我找到了 TouchBegan 方法 但它从未被调用过 我没有初始化有关此方法的任何其他内容 void touche
  • 是否可以在不登录的情况下冒充用户?

    是否可以在不提供用户名 密码的情况下模拟用户 基本上 我想得到CSIDL LOCAL APPDATA对于使用以下命令的用户 不是当前用户 ShGetFolderPath 功能 我目前拥有的只是该用户的 SID 您可以通过调用 ZwCreat
  • Nodejs - HTTP 范围支持/部分文件下载

    我正在创建一个音乐网络应用程序 用于流式传输我存储在 MongoDB GridFS 中的 MP3 我的问题 如何添加 http 范围支持 以便我可以开始流式传输音频文件 1 2 而无需等待缓冲区 我知道GridFS支持读取X字节 X字节 所
  • 为什么选择 UnityEvent 而不是本机 C# 事件?

    我的意思是 UnityEvents 比原生 C 事件慢 并且它们仍然存储对接收器的强引用 因此 我发现使用 UnityEvents 而不是原生 C 事件的唯一有效原因是它们与编辑器的集成 我是否忽略了什么 我是否忽略了什么 不 你没有忽视任
  • Java - 将二进制解析为长整数[重复]

    这个问题在这里已经有答案了 我有一个数字的二进制表示形式 想将其转换为 long 我有 Java 8 public class TestLongs public static void main String args String a L
  • Android WebView 下载不工作

    我创建了一个包含 html 表单页面的 Web 视图 在提交表单 使用 post 方法 时 它应该下载该文件 我已经实施了webview download listener这样我就可以处理下载了 Override public void o
  • 如何手动创建 UISplitView?

    我有一个应用程序将导航到 UISplitView 完全在另一个视图内 如下所示 void switchToMyDayView NSLog Show My Day Screen if self myDayController view sup
  • Dart 中用于获取数据类型大小的函数/运算符

    我想知道 Dart 中分配给不同数据类型的内存量 但我找不到函数 运算符 例如sizeofC 中的运算符来执行此操作 我已经提到了dart core为此目的图书馆 但仍然找不到任何合适的方法 那么 是否有其他方法可以获取数据类型的大小 或者
  • 使用 SymPy 求解方程组

    我正在尝试使用 SymPy 0 7 1 求解一组方程 from sympy import equations Eq S vf S vi a t Eq S d S vi t 1 2 a t 2 Eq S a S 10 Eq S d S 60
  • BASH 在变量非文件中提取字符串后的值[重复]

    这个问题在这里已经有答案了 我发现了一个无法解决的奇怪问题 我需要提取变量中的一些值 这些值位于字符串后面 本例中变量的名称是 DSLSTATE 这是其中值的示例 NewEnable 1 NewStatus Up NewDataPath F
  • 使用 matplotlib 在 qiskit 中可视化电路

    我正在学习如何使用 qiskit 并且正在使用 jupyter 笔记本 但是每次我尝试使用属性绘制来可视化电路时 我都会收到此错误 import qiskit from qiskit import from qiskit import IB
  • 如何在 Linux、Mac 和 Windows 上从 Java 启动 .NET 应用程序?

    我想从 Java 环境的上下文中启动 NET 应用程序 与 Mono 兼容 我的猜测是 我必须以某种方式确定是否安装了 mono 找到位置并使用 NET 应用程序路径作为参数启动它 但什么是可靠的方法呢 或者 还有更好的方法 也许我应该澄清
  • 按HOME后重新启动应用程序时如何返回到最新启动的活动? [复制]

    这个问题在这里已经有答案了 熟悉的场景 我有一个Main启动的活动Game按下按钮时的活动 如果用户按 HOME 然后再次启动我的应用程序 则应显示GameActivity 这是他最后一次使用该应用程序时所做的事情 然而 相反发生的事情是他
  • 为什么 div 会有这样的行为?

    有时我的 div 会出现这个问题 无法按预期运行 我想要的是让它们按照我的理解 流动 布局 但它们不是 我只是想知道为什么不 我已经使用 firebug 来检查 css 似乎没有任何不符合规范的内容 但它们并没有一个接一个地流动 我提供了两
  • 在领域驱动设计中,您可以在 UI 中使用领域实体吗?

    在许多领先的 DDD 项目中 尤其是 MVC 风格 我看到 UI 使用镜像域实体的显示对象 而不是直接使用这些域对象 这种风格显然是为了解耦和分离关注点 我个人更喜欢这种风格 但我不确定这是否是 DDD 的严格原则 或者这是否只是不同开发人
  • 我需要做直方图拉伸

    我有一个 BitmapFrames 数组 需要进行直方图拉伸 我知道这与直方图均衡不同 最终结果是什么 有点 问题是我完全不知道得到直方图后该怎么做 到目前为止 我的代码为直方图创建了一个数组 因此我知道每个值有多少个像素 但在那之后我不知
  • 让semantic_errors呈现准确的错误消息

    我有一个模型Camping which has many Images 露营至少需要一张图片 class Camping lt ActiveRecord Base attr accessible images attributes has
  • PostgreSQL:如何实现最小基数?

    正如这个问题中的回答 PostgreSQL 中的基数 https stackoverflow com questions 3135206 cardinality in postgresql 基数是使用强制执行的限制条件 http www p
  • 使用游标获取字段值

    我正在创建一个应用程序 但遇到问题Cursor 我有一个SQLiteDatabase这给我返回了一个Cursor当我尝试使用此函数获取值时 public Cursor fetchOption long rowId throws SQLExc
  • 如何将“zd”说明符与“printf()”一起使用?

    寻求有关使用的说明 zd with printf 当然 对于 C99 及更高版本 以下内容是正确的 void print size size t sz printf zu n sz C 规范seems允许printf zd n sz 取决于