2017-09-18 1 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이 발생합니다. 정의되지 않은 동작은 아무 일도 발생할 수 없음을 의미합니다. 예상치 못한 결과를 포함하되 이에 국한되지는 않습니다.

두 번째 줄 (또는 첫 번째 줄은 undefined behaviour can time-travel부터)에 대한 특정 출력을 기대할 이유가 없습니다.