0

请检查以下程序

#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 放入另一个字节。如何做到这一点。请告诉一些事情

请给出一些答案。

4

2 回答 2

5

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

于 2013-05-13T10:47:45.917 回答
3

您正在调用未定义的行为

您只分配了 3 个字节Date并存储了 5 个字节。

四个字节2013和 1 个 NUL 字节。因此,如果要存储2013.


如果您想传输字节流,那么我建议您按以下方式进行:

#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

奇怪的字符是因为将一些字节值解释为字符串。根据您的实现,普通字符可能已签名或未签名。所以使用 unsigned char 来避免对字节的错误解释。

于 2013-05-13T10:45:56.160 回答