2017-09-18 4 views
-2

ネットワークからデータストリームを受信し、受信したデータを出力したい。 以下は私のプログラムの一部です。c printf形式について

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 

私はちょうど"%2X""%.01f"からAskPrice1の出力形式を変更しましたが、AskVolume1の結果も変更されました。

なぜこれが起こりますか?

+1

すべてのコンパイラの警告を有効にします。確かに、彼らは 'printf()'の不具合のコード化に関する迅速なフィードバックを提供します。 – chux

+0

'printf'関数(および他のすべての標準関数)に関する情報があれば。そして、そのような情報をウェブで検索するためのものがあります。うーん、そういうものがあれば私は本当にgoogleすべきだ... – Olaf

答えて

0

間違った書式指定子を使用すると、undefined behaviourが発生します。定義されていない動作とは、何かが起こることを意味します予期せぬ出力を含みますが、これに限定されません。

2行目(またはその行の最初の行は、undefined behaviour can time-travel以降)の出力を期待する理由はありません。

関連する問題