C 短无符号数据中的字节分配

C 短无符号数据中的字节分配,c,C,请检查以下程序 #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],Dat

请检查以下程序

#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
#包括
#包括
int main()
{
char*Date=NULL;
无符号短y=2013;
日期=malloc(3);
sprintf((字符*)日期,“%hu”,y);
printf(“%d%d%d%d%d\n”,日期[0],日期[1],日期[2],日期[3],日期[4]);
printf(“%s%d%d”,日期,strlen(日期),sizeof(y));
}
输出:
50 48 49 51 0
2013 4 2
我是如何得到字符串长度4而不是2的,因为我把一个短的整数值放入内存中,所以它应该被占用在2字节的内存中

每个字节如何从输入中获取2 0 1 3,而不是在一个字节中获取20,在另一个字节中获取13

我想把20换成一个字节,13换成另一个字节。怎么做。请告诉我一些事情

请给出一些答案。

您正在调用未定义的行为

您只为日期分配了3个字节,并存储了5个字节

四个字节用于
2013
和一个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));
}

奇怪的字符是因为将某些字节值解释为字符串。纯字符可以是有符号的,也可以是无符号的,具体取决于您的实现。因此,请使用无符号字符以避免对字节的错误解释。

如其名称所示,sprintf函数将写入格式化字符串。因此,您的数字2013被转换为“2013”(一个5个字符的字符串)。

这就是sprintf(日期,%hu),y)将数字转换为十进制字符串表示形式。2013有四个数字,因此需要四个字符来显示它(加上一个0-终止符)。您只分配了三个字节,因此有未定义的行为。-1:虽然这是完全正确的信息,但它没有回答所问的问题。@pradipta
Date[0]=y/100;日期[1]=y%100;日期[2]=0
20
存储在索引0处,将
13
存储在索引1处,并用NUL终止,将得到3字节的数据。我不确定这是否是OP想要的。可能是,如果你说出目的,这将有助于给出更好的答案。因为ASCII字符不可打印。你想通过网络或其他方式传递吗?谢谢你的回答,是的,我想通过网络发送,但我的问题是为什么sprintf不能以2字节的形式存储数据,就像sprintf存储格式化字符串一样,它在一个字节中存储一个字符,但你的解决方案看起来不错。我没有得到ASCII字符,因为它们不可打印。你能解释一下吗?@pradipta我的意思是,如果你将ASCII字符打印为字符串,那么你会得到一些字符,就像在我的编辑中一样。即使字节存储正确,您也可以通过将其打印为字符串来检查任何内容。感谢您的回答,这意味着我将在字符串中输入的内容将始终根据源上可用的字符数(字节)进行计算。我是否正确。很抱歉,我不确定是否正确理解您的问题(可能是因为英语不是我的母语)……无论如何,关键是要理解sprintf用目标参数的“字符串化”版本替换了每种格式(当然,如果它已经是字符串的话除外)。@pradipta是否要将
20
存储在
date[0]
13
存储在
date[1]
然后打印字符串?ASCII字符20和13不可打印。因此,可以这样存储它们,但不能打印字符串。
� 2 2