短整数的格式说明符

时间:2010-06-01 19:26:12

标签: c++ c debugging format-specifiers

我没有正确使用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] =另一个char ....

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

感谢。

8 个答案:

答案 0 :(得分:5)

我很困惑 - 问题在于你说strlen(dest)+6final字符串的长度限制为10个字符(加上一个空终止符)。如果你说strlen(dest)+8那么就会有足够的空间来存放整个字符串。

更新

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

Unsigned short最多可以包含5个字符,对吧? (0 - 65535)

好像您需要为unsigned short分配5个字符才能涵盖所有值。

哪个指向使用它:

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

答案 4 :(得分:1)

格式化时,数字(500)占用三个空格,而不是一个空格。因此,snsprintf应将最终长度设为strlen(dest)+5+3。然后修复您的malloc来电调整。如果您要计算数字的strlen,请使用此strlen(itoa(val))之类的调用进行计算。此外,忘记了dest末尾的NULL,但我认为strlen考虑到了这一点,但我不确定。

答案 5 :(得分:1)

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

答案 6 :(得分: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);

答案 7 :(得分: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); 

但对于看待它的人来说这是没有意义的,并且对于字节序很敏感。我强烈建议不要这样做。