c - 使用具有固定宽度整数类型变量的 printf 宽度说明符
问题描述
w是指定输出宽度的参数,p是数字,应该以八进制系统打印 两个变量都应该是固定宽度整数(uint32_t)(这是我的编程课的任务)。我用谷歌搜索,我可以使用宏 PRIo32 (inttypes.h) 以八进制打印 int32_t,但我找不到任何宽度说明符的宏。所以当我尝试:
printf("%*" PRIo32 "\n", w, p);
我在测试系统中收到此错误
错误:字段宽度说明符“*”需要“int”类型的参数,但参数 2 的类型为“int32_t”[-Werror=format=]
有没有解决这个问题的宏?还是我应该尝试别的?
解决方案
将uint32_t
宽度转换为int
. @卡米尔库克
// printf("%*" PRIo32 "\n", w, p);
printf("%*" PRIo32 "\n", (int) w, p);
如有必要,检测极端情况
assert(w <= INT_MAX);
printf("%*" PRIo32 "\n", (int) w, p);
不需要关于int
范围的假设。
更深的
请注意,由于环境限制,单张大宽度的打印件会遇到麻烦。超过 4095 左右的宽度可能根本不起作用。
环境限制 任何一次转换可以产生的字符数至少应为 4095。 C17dr § 7.21.6.1 15
代码可以使用下面的代码来处理病态的大宽度——尽管它效率不高。
uint32_t w2 = w;
while (w2 > 100) {
w2--;
putchar(' ');
}
printf("%*" PRIo32 "\n", (int) w2, p);
推荐阅读
- android - android 显示错误 org.json.JSONException: Value
我正在做与Android相关的作业。我尝试了 3 次并查看了各种来源以解决我面临的问题,但结果仍然相同。
该项目与 crud android 相关,但使用 mysql 和 php 代码
- reactjs - 无法使用“create-react-app”创建反应应用程序
- android - 从 Firebase-Storage 将图像存储在 Localstorage 中并获取路径
- operating-system - 每个系统调用是否创建一个进程?
- matplotlib - 如何绘制多个相互堆叠的图形
- java - 加载序列化的 Ecore 模型作为 XMI 无法正确加载容器
- c - C中具有不同数据类型的键值
- .net-core - 在本地网络中运行 .net core web api
- python - 检查是否在 Python 中定义了要避免的变量?
- java - ProgressBar 崩溃活动(空对象引用/或不可见)