将C11附录K的sprintf_s转换为C99 snprintf

conversion of C11 Annex K's sprintf_s to C99 snprintf

本文关键字:转换 C99 snprintf sprintf C11 附录      更新时间:2023-10-16

我用这种格式将sprintf_s函数转换为C99。我只是想确保,结果是一样的:

sprintf_s(char_star,"%08X",some_int);

char_star的大小为8。它将some_int转换为8个字节的char_star

是我在C99中更正的吗?我使用了以下函数之一,尽管这些C99函数和C11附件K sprintf_s的输出不一样

char str[9];
snprintf (str, 8, "%08x", i );
//      sprintf(str, "%08x", i);
QByteArray built(str, 8);
qDebug() << built.toHex();
MFC中的

它给了我这个包和sprintf

30 30 30 31 30 30 44 43

in C99sprintf(str, "%08x", i)

30 30 30 31 30 30 64 63

你知道问题是从哪里来的吗?

下面是整个函数:

bool BuildAnglePacket(char* WR_PacketAZAngle, float AZAngle)
{
    WR_PacketAZAngle[0] = 0x04;
    WR_PacketAZAngle[1] = 0x30;
    WR_PacketAZAngle[2] = 0x31;
    WR_PacketAZAngle[3] = 0x02;
    WR_PacketAZAngle[4] = 0x79;
    WR_PacketAZAngle[5] = 0x4E;
    WR_PacketAZAngle[6] = 0x48;
    int  XOR;
    char HAnlge[9];
    int iAzimuthAngle;

    if (AZAngle >= -22.5 &&  AZAngle <= 22.5 )
    {
        iAzimuthAngle = AZAngle*10;
        if( AZAngle < 0)
        {
            iAzimuthAngle= abs(iAzimuthAngle);
            iAzimuthAngle=((~iAzimuthAngle)&0xFFFF) + 1 ;
        }
        iAzimuthAngle=65536 + iAzimuthAngle;
        sprintf(HAnlge,"%08x", iAzimuthAngle);
        WR_PacketAZAngle[7]  = HAnlge[0];
        WR_PacketAZAngle[8]  = HAnlge[1];
        WR_PacketAZAngle[9]  = HAnlge[2];
        WR_PacketAZAngle[10] = HAnlge[3];
        WR_PacketAZAngle[11] = HAnlge[4];
        WR_PacketAZAngle[12] = HAnlge[5];
        WR_PacketAZAngle[13] = HAnlge[6];
        WR_PacketAZAngle[14] = HAnlge[7];
        WR_PacketAZAngle[15] = 0x03;
        for(int i=4;i<16;i++)
            XOR ^= WR_PacketAZAngle[i];
        WR_PacketAZAngle[16] = XOR;
        WR_PacketAZAngle[17] ='x0';
    }
    return true;
}

char_star的大小应该至少为9,以便有一个空间来存储最后一个

use

sprintf_s (char_star"x % 08",some_int);得到相同的结果。格式选项x和x是不同的!