Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 短整数的格式说明符_C++_C_Debugging_Format Specifiers - Fatal编程技术网

C++ 短整数的格式说明符

C++ 短整数的格式说明符,c++,c,debugging,format-specifiers,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中的格式说明符。有几行代码:

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]=另一个字符

我的问题是我想把短int的两个字节复制到最终数组的2个字节


谢谢

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

更新

尽管短字符的大小可能只有2个字节,但当它作为字符串打印时,每个字符将占用一个字节。这意味着,如果您正在写入10000以上的数字,那么向字符串写入一个短字符最多需要5字节的空间


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

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

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


==>您需要
strlen(dest)+8个
无符号短字符
s最多可以占用5个字符,对吗?(0-65535)

似乎您需要为
无符号短字符
分配5个字符以覆盖所有值

这将指向使用以下内容:

char* final = (char*) malloc(strlen(dest) + 10);
在以下情况下使用8而不是6:

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


格式化时,数字(500)占用三个空格,而不是一个。因此,您的
snsprintf
应该给出的最终长度为
strlen(dest)+5+3
。然后,也修复要调整的
malloc
调用。如果您想计算该号码的
strlen
,可以通过这样的调用
strlen(itoa(val))
。另外,我不能忘记dest结尾的空值,但我认为strlen考虑到了这一点,但我不确定。

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

似乎主要的误解是,“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); 
##打印原始字节、高位字节、低位字节。
snprintf(最终版,尺寸(最终版),%c%c%c%c%c%c%c%s),c,c,(val8)和0xFF,c,c,dest;

但这对人类来说是没有意义的,而且对持久性很敏感。我强烈建议不要这样做。

我想增加4个字节(4个字符)和2个以上的短整数,即6characters@cateof:但当格式化为字符串时,短整数最多可使用5个字符(字节)。在本例中使用了3(500)。@cateof您忘记了空字符,当您将短字符转换为字符串时,它将变成“500”,即三个字符长,占用三个字节。我认为最短的是32767,所以你应该留下5个字节的空间来确保它是无符号的,所以最短的是65535。但是还是五个字。a,好的。这就是问题所在。所以我需要再试一次。我想创建一个字符数组,它包含第一个字节=一个随机字符第二个字节=一个ramdom字符第三个字节和第四个字节=一个短int第五个字节=一个随机字符。那么如何将短int复制到字节数组呢?最好澄清您的问题,以反映这些更新的要求。另一个警告-raw bytes snprintf语句仅适用于无符号短int。
## 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);