2014-05-19 3 views
1

scanfuint8_t을 사용하려고하면 결과가 엉망입니다. int을 사용하면 예상되는 출력이 "08 - 15"가됩니다. uint8_t을 사용하면 "00 - 15"가됩니다.scanf가 uint8_t로 스캔 할 수 없습니다.

const char *foo = "0815"; 
uint8_t d1, d2; // output: 00 - 15 (!!!) 
// int d1, d2;   // output: 08 - 15 
sscanf(foo, "%2d %2d", &d1, &d2); 
printf("%02d - %02d\n", d1, d2); 

저는 GCC를 사용하고 있습니다.

답변

7

%d은 실제로는 int *을 전달하지만 실제로는 uint8_t *을 전달하려고하기 때문에 잘못되었습니다. 해당 매크로를 사용해야합니다.

#include <inttypes.h> 
... 
sscanf(foo, "%2" SCNu8 " %2" SCNu8, &d1, &d2); 

대부분의 컴파일러는 코드 버전에 대한 경고를 제공해야합니다. 이 printf()에 전달되기 전에 uint8_t 항상 int로 승격되기 때문에

 
test2.c:8:24: warning: format specifies type 'int *' but the argument has type 
     'uint8_t *' (aka 'unsigned char *') [-Wformat] 
sscanf(foo, "%2d %2d", &d1, &d2); 
      ~~~  ^~~ 
      %2s 
test2.c:8:29: warning: format specifies type 'int *' but the argument has type 
     'uint8_t *' (aka 'unsigned char *') [-Wformat] 
sscanf(foo, "%2d %2d", &d1, &d2); 
       ~~~  ^~~ 
       %2s 
2 warnings generated. 

uint8_t를 들어,이, printf() 적용되지 않습니다 : 여기에 연타의 출력됩니다.

+1

@wallyk : "편집"버튼을 클릭하여 오타를 수정할 수 있습니다. –

+0

물론, 나머지 코드는 완전히 익숙하지 않았기 때문에 새로운 컴파일러 기능인지 확실하지 않았습니다. – wallyk

+0

마지막 지점에서 꼭 그렇지는 않습니다. 'printf'와'va_args' 둘 모두의 구현에 따라, "잘 작동"할 수도 있고, 실패 할 수도 있습니다. – slugonamission

3

scanf 형식 지정자 %d은 "나는 당신에게 int * 줄 것을 약속드립니다"라고 말합니다. int의 주소를 제공하지 않으면 약속을 어 기게됩니다. 모든 배팅은 꺼져 있습니다. 정의되지 않은 동작.

도덕 : 컴파일러에게 거짓말하지 마십시오.

0

uint8_t가 1 바이트 일 때 scanf()가 4 바이트 유형 (int)에 대한 포인터를 기대하기 때문에 코드가 작동하지 않습니다.

0
#define __USE_MINGW_ANSI_STDIO 1 //or gcc prog.c -std=c99 -D__USE_MINGW_ANSI_STDIO 

#include <stdio.h> 
#include <stdint.h> 
#include <inttypes.h> 

int main(){ 
    const char *foo = "0815"; 
    uint8_t d1, d2; 
    sscanf(foo, "%2" SCNu8 "%2" SCNu8, &d1, &d2); 
    printf("%02" PRIu8 " - %02" PRIu8 "\n", d1, d2); 
    return 0; 
} 
관련 문제