首页 > 解决方案 > 如何像 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)的工作方式与我想象的不同吗?

标签: c

解决方案


数量是最小值。

在任何情况下,不存在或较小的字段宽度都不会导致字段截断;如果转换结果比字段宽度宽,则扩展字段以包含转换结果。

对于%s,您可以使用精度来指定最大值

[可选精度] 给出 [...] 要从字符串打印的最大字符数sS转换。

所以使用

snprintf(target, sizeof(target), "%3.3s%1.1s", src1, src2);

(不需要target[4] = '\0';这个!)


推荐阅读