所以,我正在重写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,我会很高兴。
答案 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]);
}