Printf打印的数量超过了数组的大小

时间:2017-05-07 16:58:44

标签: c arrays string printf

所以,我正在重写tar extract命令,我偶然发现了一个奇怪的问题:

简而言之,我分配了一个包含多个char数组的HEADER结构,让我们说:

struct HEADER {
     char foo[42];
     char bar[12];
}

当我fprintf foo时,我得到一个3个字符长的字符串,这是正常的,因为第四个字符是' \ 0'。但是当我打印栏时,我有25个字符被打印出来。

如何才能获得12个字符的条形码?

编辑数组未终止的事实是正常的'并且不能改变,否则我不会有这么多麻烦。我想要做的是解析我的数组的x个第一个字符,比如

char res[13];
magicScanf(res, 12, bar);
res[12] = '\0'

编辑事实证明字符串WAS已经以空值终止。我认为它不是因为它是我的bug的最逻辑可能性。作为另一个问题,我将接受与所述问题相符的答案。如果有人知道为什么sprintf可以打印25个字符,包括2 \ 0,我会很高兴。

3 个答案:

答案 0 :(得分:1)

您可以通过包含精度来打印没有NUL终止符的字符串:

printf ("%.25s", s);

或者,如果在编译时你的精度未知:

printf ("%.*s", length, s);

答案 1 :(得分:0)

问题是调用函数时数组的大小会丢失。因此,fprintf函数不知道数组的大小,只能以\0结束。

答案 2 :(得分:0)

void printbar(struct HEADER *h) {
    printf("%.12s", h->bar);
}

您可以像这样使用

struct HEADER data[100];
/* ... */
printbar(data + 42); /* print data[42].bar */

请注意,如果bar的12个字节中的一个值为零,则不会全部打印出来。
你可能最好逐个打印它们

void printbar(struct HEADER *h) {
    printf("%02x", h->bar[0]);
    for (int i = 1; i < 12; i++) printf(" %02x", h->bar[i]);
}