0

我没有正确使用 C 中的格式说明符。几行代码:

int main()
{
        char dest[]="stack";
        unsigned short val = 500;
        char c = 'a';

        char* final = (char*) malloc(strlen(dest) + 6);

        snprintf(final, strlen(dest)+6, "%c%c%hd%c%c%s", c, c, val, c, c, dest); 

        printf("%s\n", final);
        return 0;
}

我想要的是复制

final [0] = 一个随机字符 final [1] = 一个随机字符 final [2] 和 final [3] = 短数组 final [4] = 另一个字符 ....

我的问题是我想将 short int 的两个字节复制到最终数组的 2 个字节。

谢谢。

4

8 回答 8

5

我很困惑 - 问题是你在说strlen(dest)+6将字符串的长度限制final为 10 个字符(加上一个空终止符)。如果您说strlen(dest)+8,那么将有足够的空间容纳完整的字符串。

更新

即使一个 short 的大小可能只有 2 个字节,但当它作为字符串打印时,每个字符都将占用一个字节。所以这意味着如果你写一个大于 10000 的数字,它可能需要多达 5 个字节的空间来写一个短字符串。

现在,如果您使用格式说明符将短字符串作为十六进制数写入字符串%x,它将占用不超过 2 个字节。

于 2010-06-01T19:30:06.083 回答
1

您需要为 13 个字符分配空间 - 而不是 11 个。不要忘记终止 NULL。

于 2010-06-01T19:30:58.047 回答
1

您丢失了一个字节,因为您认为 short 变量需要 2 个字节。但它需要三个:每个数字字符一个('5','0','0')。您还需要一个'\0'终止符(+1 字节)。

==> 你需要strlen(dest) + 8

于 2010-06-01T19:32:34.160 回答
1

Unsigned shorts 最多可以占用 5 个字符,对吗?(0 - 65535)

似乎您需要为您分配 5 个字符unsigned short来涵盖所有值。

这将指向使用这个:

char* final = (char*) malloc(strlen(dest) + 10);
于 2010-06-01T19:32:35.323 回答
1

格式化后,数字 (500) 占用三个空格,而不是一个。所以你snsprintf应该给出最终长度为strlen(dest)+5+3. 然后还修复您的malloc呼叫以进行调整。如果您想计算strlen数字的 ,请使用这样的调用来执行此操作strlen(itoa(val))。另外,不能忘记 dest 末尾的 NULL,但我认为 strlen 考虑到了这一点,但我不确定。

于 2010-06-01T19:33:44.843 回答
1

简单的答案是您只为 strlen(dest) + 6 个字符分配了足够的空间,而实际上看起来您将有 8 个额外的字符......因为您的数字中有 2 个字符 + 3 个字符 + 2 个字符after + dest (5 chars) = 13 char 当您分配 11 个字符时。

于 2010-06-01T19:33:48.387 回答
0

使用 8 而不是 6:

char* final = (char*) malloc(strlen(dest) + 6);

snprintf(final, strlen(dest)+6, "%c%c%hd%c%c%s", c, c, val, c, c, dest);
于 2010-06-01T19:32:44.357 回答
0

似乎主要的误解是“2 字节”短不能在屏幕上表示为 2 个 1 字节字符。

首先,留出足够的空间:

char* final = (char*) malloc(strlen(dest) + 9);

1 字节字符的整个可能值范围是不可打印的。如果您想在屏幕上显示它并使其可读,则必须将 2 字节短编码为 4 个十六进制字节,例如:

## as hex, 4 characters
snprintf(final, sizeof(final), "%c%c%4x%c%c%s", c, c, val, c, c, dest);

如果您将其写入文件,那没关系,您可以尝试以下操作:

## print raw bytes, upper byte, then lower byte.
snprintf(final, sizeof(final), "%c%c%c%c%c%c%s", c, c, ((val<<8)&0xFF), ((val>>8)&0xFF), c, c, dest); 

但这对于一个看着它的人​​来说是没有意义的,并且对字节顺序很敏感。我强烈反对它。

于 2010-06-01T20:14:06.333 回答