请检查以下程序
#include <stdio.h>
#include<stdlib.h>
int main()
{
char *Date= NULL;
unsigned short y=2013;
Date = malloc(3);
sprintf((char *)Date,"%hu",y);
printf("%d %d %d %d %d \n",Date[0],Date[1],Date[2],Date[3],Date[4]);
printf("%s %d %d",Date,strlen(Date),sizeof(y));
}
output:
50 48 49 51 0
2013 4 2
我如何获得字符串长度4而不是2,因为我将一个短整数值放入内存中,因此它应该占用2字节的内存。但它是如何占用4个字节。
每个字节如何从输入获得2 0 1 3,而不是一个字节中的20个和另一个字节中的13个。
我想把20个字节和13个字节放到另一个字节。如何做到这一点。热情地说出来
请给出一些答案。
答案 0 :(得分:5)
正如其名称所示,sprintf函数编写一个格式化的字符串。因此,您的号码2013将转换为“2013”(5个字符的字符串)。
答案 1 :(得分:3)
您正在调用未定义的行为。
您只为Date
分配了3个字节并存储了5个字节。
2013
的四个字节和1个NUL字节。因此,如果要存储2013
,则应至少分配5个字节。
如果要传输字节流,我建议您按以下方式进行:
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
unsigned char *Date= NULL;
unsigned short y=2013;
unsigned char *p;
p = (unsigned char*) &y;
Date = malloc(3);
Date[0] = *p;
Date[1] = *(p+1);
Date[2] = 0;
printf("%s %d %d",Date,strlen(Date),sizeof(y));
}
输出:
� 2 2
奇怪的char是因为将一些字节值解释为字符串。普通字符可以是签名或未签名,具体取决于您的实现。因此,请使用unsigned char来避免对字节的错误解释。