我没有正确使用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个字节。
感谢。
答案 0 :(得分:5)
我很困惑 - 问题在于你说strlen(dest)+6
将final
字符串的长度限制为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);
但对于看待它的人来说这是没有意义的,并且对于字节序很敏感。我强烈建议不要这样做。