char *和char []没有得到相同的输出

时间:2013-05-29 11:42:06

标签: c++ c visual-c++ system-calls

我把函数参数作为char *,在我的情况下,我得到XOR等于210.另一方面,在另一方面,我把第一个参数不是char *而是简单的char []而XOR是114 , 哪个是对的。

怎么了?为什么我不能在这里得到同样的东西?

感谢您的回复。

更新:你是对的。 sprintf()工作正常。问题是代码的其余部分。

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;

//    AZAngle = 22;

    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;
}

解决:是的,我忘了初始化XOR。

3 个答案:

答案 0 :(得分:5)

问题不在sprintf_ssprintf。值65536 + 150 =&gt; 65686 =&gt; 0x10096。

这是您的代码打印的正确结果,其他任何内容都是错误的。顺便说一句,我认为你的意思是150而不是15,因为0x96 =&gt; 150。

是不是你的Windows版本中的iAngle是unsigned short,所以它包裹起来你实际得到150而不是65536 + 150?这可以解释'00000096'的输出,但这意味着它是原始计算代码中的错误,而不是打印本身。

顺便说一句,我认为真正的代码没有char HAngle;但是像char HAngle[..];之类的东西,否则在编译器出于某种原因睡着并且不会产生错误的情况下会发生任何事情。

编辑: 更新后的代码显示XOR未初始化,并且在计算中使用之前可以包含任何内容,因此您可以获得任何结果。您必须先将其设置为0。在Windows方面,如果您正在测试将整数变量设置为0或纯粹机会的调试版本,它可能会起作用。

答案 1 :(得分:2)

int iAngle = 15; // for example
char HAngle;

iAngle = 65536 + iAngle;

所以iAngle == 65536 + 15 == 65551以十六进制为0x0001000F。如果你把它打印成字符串,你不应该得到以下内容吗?

[0]    48 '0'
[1]    48 '0'
[2]    48 '0'
[3]    49 '1'
[4]    48 '0'
[5]    48 '0'
[6]    48 '0'
[7]    70 'F'
[8]    0 '\0'

在这种情况下,索引3必须始终为十六进制1

看起来Windows功能正在做一些奇怪的事情......

如果您要打印它,HAngle也应该是一个数组,否则您将溢出分配给它的存储。当你调用sprintf时,你似乎能够将它当作指针对待,所以我假设你的意思是char *HAngle并且在打印之前为缓冲区分配了内存?

编辑:从您更新的代码看起来XOR未初始化?如果不是那么它可以从任何随机值开始(编译器不必将其设置为零,我害怕:))。这可以解释不同的结果。在两边它可以有一个任意的初始值,并且在一侧发生的初始值为零......

答案 2 :(得分:2)

原始问题没有多大意义:除非您将HAngle更改为数组(或指向数组的指针),否则代码将无法编译;十六进制96是十进制150,而不是15;并且你得到额外的1,因为你正在为值增加65536(十六进制10000)。

在更新的问题中,您获得XOR的不确定值(以及技术上未定义的行为),因为您从未初始化它。你想要:

int XOR = 0;
        ^^^