从网络接收数据流,我想打印出接收到的数据。
以下是我程序的一部分。

struct BestPriceField
{
    double  BidPrice1;
    int     BidVolume1;
    double  AskPrice1;
    int     AskVolume1;
};

// convert network order to host order (double)
double ntoh64(uint8_t *input)
{
    double rval;
    uint8_t *data = (uint8_t *)&rval;

    data[0] = input[7];
    data[1] = input[6];
    data[2] = input[5];
    data[3] = input[4];
    data[4] = input[3];
    data[5] = input[2];
    data[6] = input[1];
    data[7] = input[0];
    return rval;
}

// get data from network data stream
struct *best_price = receive_from_network();
printf("BidPrice1:%.0lf, BidVolume1:%u, AskPrice1:%.0lf, AskVolume1:%u\n",
    ntoh64((uint8_t *)&best_price->BidPrice1) ,
    ntohl(best_price->BidVolume1),
    ntoh64((uint8_t *)&best_price->AskPrice1) ,
    ntohl(best_price->AskVolume1));
printf("BidPrice1:%.0lf, BidVolume1:%u, AskPrice1:%2X,   AskVolume1:%u\n",
    ntoh64((uint8_t *)&best_price->BidPrice1) ,
    ntohl(best_price->BidVolume1),
    ntoh64((uint8_t *)&best_price->AskPrice1) ,
    ntohl(best_price->AskVolume1));


运行此代码后,得到以下结果。

BidPrice1:145210, BidVolume1:3, AskPrice1:0, AskVolume1:4193532217
BidPrice1:145210, BidVolume1:3, AskPrice1:F9F43939, AskVolume1:66


我只是将AskPrice1的输出格式从"%.01f"更改为"%2X",但是AskVolume1的结果也已更改。

为什么会发生这种情况?

最佳答案

使用错误的格式说明符会导致undefined behaviour。未定义的行为意味着任何事情都可能发生。包括但不限于意外输出。

没有理由期望第二行(或第一行,因为undefined behaviour can time-travel起)有一些特定的输出。

关于c - 关于C printf格式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46270255/

10-11 15:51