【问题标题】:Unexpected result in sprintf()sprintf() 中的意外结果
【发布时间】:2017-05-04 14:23:17
【问题描述】:

有人可以帮助我了解发生了什么吗?

char pcMessage[255];
iMsgAllocatedLength=255;
unsigned long long ullRecordID = 135290303ULL;
sprintf_s(pcMsg, iMsgAllocatedLength, "%08X;%llu", ullRecordID, ullRecordID);

给出以下结果

08105DBF;581067426850930688;

虽然

sprintf_s(pcMsg, iMsgAllocatedLength, "%010llu;%08X;", ullRecordID, ullRecordID);

给出预期的结果

0135290303;08105DBF

请注意我只是颠倒了顺序,还请注意
581067426850930688 是 08105DBF00000000

请帮我理解。

【问题讨论】:

    标签: c printf endianness


    【解决方案1】:

    使用%X 格式说明符打印unsigned long long 是未定义的行为,因为sprintf 期望unsigned int 用于%X。当您不幸的巧合切换说明符时,它会产生正确的结果。不同平台上的行为可能不一样。

    使用%llX 打印值:

    sprintf_s(pcMsg, iMsgAllocatedLength, "%08llX;%llu", ullRecordID, ullRecordID); 
    

    【讨论】:

    • @Nguaial 已编辑。谢谢!
    【解决方案2】:

    您将unsigned long long 传递给"%x" 说明符,它需要unsigned int。因此,您的代码涉及未定义的行为。没有人知道在这种情况下会发生什么,你不能指望任何事情。它可能会工作,也可能会崩溃,或者可能会打印出您期望的部分内容,或者打印垃圾,或者绝对是其他任何东西。

    【讨论】:

      【解决方案3】:

      在没有任何长度修饰符的情况下,%X 指令期望对应的参数是 unsigned int 类型。在您的情况下,相应的参数实际上是 unsigned long long int,这不太可能是 - 在您的情况下显然不是 - 相同的类型。您想改用%llX

      sprintf_s(pcMsg, iMsgAllocatedLength, "%08llX;%llu", ullRecordID, ullRecordID);
      

      请注意,打印预期输出的版本也是错误的——你只是走运了。

      【讨论】:

        猜你喜欢
        • 2011-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-15
        • 2012-04-02
        • 2019-05-14
        • 2017-07-11
        相关资源
        最近更新 更多