-
22-10-2019 - |
题
我无法正确使用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 short
S最多可以占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);
但这对人类看着它是没有意义的,并且对伊尼亚语很敏感。我强烈建议反对它。