c - 如何像 strncat 一样使用 snprintf?
问题描述
char src1[4+1];
char src2[4+1];
char target[4+1];
strncpy(src1, "1234", sizeof(src1));
strncpy(src2, "ABCD", sizeof(src2));
snprintf(target, sizeof(target), "%3s%1s", src1, src2);
target[4] = '\0';
printf("result: %s\n", target);
结果是“1234”,但我想制作“123A”。
strncpy(src1, "1234", sizeof(src1));
strncpy(src2, "ABCD", sizeof(src2));
strncpy(target, src1, 3);
strncat(target+3, src2, 1);
printf("result: %s\n", target);
当我使用 strncat 而不是 snprintf 时,它运行良好。
有人可以解释为什么这段代码(snrpintf)的工作方式与我想象的不同吗?
解决方案
数量是最小值。
在任何情况下,不存在或较小的字段宽度都不会导致字段截断;如果转换结果比字段宽度宽,则扩展字段以包含转换结果。
对于%s
,您可以使用精度来指定最大值
[可选精度] 给出 [...] 要从字符串打印的最大字符数
s
和S
转换。
所以使用
snprintf(target, sizeof(target), "%3.3s%1.1s", src1, src2);
(不需要target[4] = '\0';
这个!)
推荐阅读
- odoo - 所选公司与相关用户的公司不兼容
- python - 对如何让不和谐机器人发送一定数量的消息感到困惑?
- javascript - 动画徽标从角落飞到屏幕中心
- python - 通过 Keras 加载自定义数据集
- validation - 只允许整数,但显示为 '.' 千篇一律,便于阅读
- powerbi - 基于每天行数的 DAX 滚动平均值
- java - 如何在 Android Studio Activity 中设置布局和视图的内容?
- r - 使用中值创建新数据框(按行子集)
- selenium - 如何在 HTML 结构中使用 WebDriver 的“getAttribute”方法?
- elasticsearch - 即使在重新启动后也能识别 Pod (Kubernetes)