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

文字列の長さを2ではなく4にする方法は、短い整数値をメモリに入れているため、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

未定義の動作を呼び出しています。

5 バイトを格納するために 3 バイトのみを割り当てDateました。

4 バイト2013と 1 NUL バイト。したがって、保存する場合は、少なくとも 5 バイトを割り当てる必要があります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

奇妙な文字は、一部のバイト値を文字列として解釈するためです。プレーン char は、実装に応じて、署名されている場合と署名されていない場合があります。したがって、 unsigned char を使用して、バイトの誤った解釈を回避してください。

于 2013-05-13T10:45:56.160 に答える