2010-06-01 81 views
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; 
} 

我想是在

复制

最终[0] =一随机炭 最终[1] =随机炭 最终[2]和最终[3] =短阵列 最终[4] =另一炭....

我的问题是,我要复制的short int的两个字节到最后一个数组的2个字节。

谢谢。

回答

5

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

更新

即使很短的可能只是在大小为2个字节,当它被打印为串中的每个字符会占用一个字节。因此,这意味着如果要写入10000以上的数字,它可能需要最多5个字节的空间才能写入一个字符串。

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

+0

我想为一个短整数添加4个字节(4个字符)和2个字符,也就是6个字符 – cateof 2010-06-01 19:31:40

+0

@cateof:但是当您的短整数格式化为字符串时,最多可以使用5个字符(字节)。它在这种情况下使用3(500)。 – 2010-06-01 19:33:06

+2

@cateof您忘记了NULL字符,并且当您将short转换为字符串时,它变为“500”,这是三个字符长,占用三个字节。我相信max short是32767,所以你应该留下5个字节的空间以确保它适合 – 2010-06-01 19:33:34

1

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

1

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

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

+0

a,好的。那就是问题所在。所以我需要再试一次。 我想创建一个包含 第1个字节=随机字符 第2个字节=一个ramdom焦炭 第3和第4个字节= short int类型 5个字节=随机字符一个字符数组。 所以,我怎么能在短整型复制到一个字节数组? – cateof 2010-06-01 19:38:19

+0

最佳澄清你的问题,以反映这些更新的要求。 – jmanning2k 2010-06-01 19:42:36

1

Unsigned short S可长达5个字符,对不对? (0 - 65535)

好像你需要为你的unsigned short分配5个字符来覆盖所有的值。

这将指向使用这样的:在

char* final = (char*) malloc(strlen(dest) + 10); 
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); 
1

当格式化的数字(500)采用了三空间,而不是一个。所以你的snsprintf应该给最后的长度为strlen(dest)+5+3。然后还修复你的malloc调用来调整。如果您想计算号码的strlen,请拨打电话strlen(itoa(val))。此外,不能忘记在dest结束时的NULL,但我认为strlen考虑到了这一点,但我并不确定。

1

答案很简单,你只分配足够的空间的strlen(DEST)+ 6个字符时,在所有的现实,它看起来像你将有8个额外的字符...因为你有2个字符+ 3个字符在数+ 2个字符+ DEST后(5个字符)= 13炭时分配11个字符。

0

好像主误解是,一个“2字节的”短不能在屏幕上被表示为2 1字节字符。

首先,留下足够的空间:

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

对于1字节字符的可能值的整个范围是不可打印的。如果你想在屏幕上显示这一点,是可读的,你必须在2个字节的短4个十六进制字节,如编码:

​​

如果你正在写这一个文件,那也行,你可以尝试以下操作:

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

但是,这没有意义的人在看它,是字节序敏感。我强烈建议不要这样做。

+0

另一个警告 - 原始字节snprintf语句仅适用于* unsigned * short int。 – jmanning2k 2010-06-01 20:17:18