我无法正确使用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;
}

我想要的是复制

最终[0] =随机char final [1] =一个随机char最终[2],最终[3] =短阵列最终[4] =另一个char ....

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

谢谢。

有帮助吗?

解决方案

我很困惑 - 问题是你在说 strlen(dest)+6 这限制了 final 字符串到10个字符(加上一个空终结器)。如果你说 strlen(dest)+8 然后,将有足够的空间容纳完整的字符串。

更新

即使简短的大小可能只有2个字节,当它打印为字符串时,每个字符都会占用字节。因此,这意味着如果您要编写10000以上的数字,则最多需要5个字节的空间才能写入短字符串。

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

其他提示

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

格式化时,数字(500)占用三个空间,而不是一个。所以你 snsprintf 应该给最终长度 strlen(dest)+5+3. 。然后还修复您的 malloc 调整调整。如果您想计算 strlen 在这个数字中,这样做的电话 strlen(itoa(val)). 。另外,不能忘记DEST尽头的空,但我认为Strlen会考虑到这一点,但我不确定。

简单的答案是,您只为Strlen(DEST) + 6个字符分配了足够的空间,而实际上您将拥有8个额外的字符...因为您有2个字符 + 3个字符 + 3个字符+ dest(5个字符)= 13个字符后,当您分配11个字符时。

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

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

这将指出使用此问题:

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

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

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

使用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);

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

首先,留出足够的空间:

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); 

但这对人类看着它是没有意义的,并且对伊尼亚语很敏感。我强烈建议反对它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top