c语言编程:字节查看器

任务描述
对于输入的按int型、float型、double型、char型数组这四种数据类型存储的数据,分别将该数据按正常形式输出以及按字节以十六进制形式输出。十六进制的字母请用大写的A,B,C,D,E,F。其中,int型、float型、double型数据按先输出高位字节,从高位字节向低位字节输出的形式。字符串型则直接按字符顺序逐字节输出。
输入
有4行,第1行是一个整数,以int型数据存储。第2行是一个带小数点的实数,以double型存储,第2行是一个带小数点的实数,以double型存储,第3行是长度为不超过100字符的英文字符串,以char型数组存储。
输出
输出4组结果每组输出2行。

第1组:第1行输出int型整数本身,第2行按字节输出该int型数据4组十六进制值。

第2组:第1行输出float型实数本身,第2行按字节输出该实数的4组十六进制值。

第3组:第1行输出double型实数本身,第2行按字节输出该实数的8组十六进制值。

第4组:第1行输出字符串本身,第2行按字节输出该字符串的每个字符的十六进制值。

每组数据的2行输出之后有空行。每两个十六进制值之间用空格分隔。

输入举例
123456
123.456
123.456
123456 and 123.456 is a number!
输出举例
123456
00 01 E2 40

123.456001
42 F6 E9 79

123.456000
40 5E DD 2F 1A 9F BE 77

123456 and 123.456 is a number!
31 32 33 34 35 36 20 61 6E 64 20 31 32 33 2E 34 35 36 20 73 20 61 20 6E 75 6D 62 65 72 21

#include "stdio.h"
#include "string.h"

int islittle()
{
    int i = 1;
    return i == (int)*((char *)&i);
}

#define LITTLEENDIAN islittle() 

void printbytes(void * ptr, size_t size, int rev = 0)
{
    int start = 0;
    int end = size;
    int step = 1;
    if (rev)
    {
        start = size - 1;
        end = -1;
        step = -1;
    }
    for (int i = start; i != end; i += step)
    {
        int val = ((unsigned char *)ptr)[i];
        char out[3];
        if (val / 16 > 9) out[0] = val / 16 + 'A' - 10; else out[0] = val / 16 + '0';
        if (val % 16 > 9) out[1] = val % 16 + 'A' - 10; else out[1] = val % 16 + '0';
        out[2] = '\0';
        printf("%s ", out);
    }
    printf("\n");
}

int main()
{
    int a;
    float b;
    double c;
    char d[101];
    scanf_s("%d", &a);
    scanf_s("%f", &b);  
    scanf_s("%lf", &c);
    fflush(stdin);
    scanf_s("%[^\n]", &d[0], 100);
    printf("%d\n", a);
    printbytes((void *)&a, sizeof(int), LITTLEENDIAN);
    printf("%f\n", b);
    printbytes((void *)&b, sizeof(float), LITTLEENDIAN);
    printf("%lf\n", c);
    printbytes((void *)&c, sizeof(double), LITTLEENDIAN);
    fflush(stdin);
    printf("%s\n", d);
    printbytes((void *)&d[0], sizeof(char) * strlen(d), 0);
    return 0;
}