2013-09-23 3 views
0

Я пытаюсь преобразовать из шестнадцатеричного или десятичного текста в unsigned int, используя спецификатор формата «% u» sscanf. Результат неверен, для значения 0x01, sscanf возвращается 0 (0).sscanf% u не intepreting hexadecimal

Согласно C++ Reference, определение "% U" спецификатора (подсветка является моей):
I, U Целого любого числа цифр, необязательно предшествует знак (+ или -). Десятичные цифры, принятые по умолчанию (0-9), но префикс 0 вводит восьмеричные цифры (0-7), и 0x шестнадцатеричные цифры (0-f).

Согласно Harbison & Стил, 3rd Edition:
и- преобразование Unsigned десятичного преобразования выполняются. ... Формат считанного числа совпадает с ожидаемым для ввода функции strtol со значением 10 для аргумента base; то есть последовательность десятичных цифр, которым необязательно предшествует - или +.

Обратите внимание, что одно из определений позволяет указать «0x» в строке.

Я использую компилятор IAR EW с набором компиляции для диалекта C99.

Какое определение подходит для C99?

Я получаю два разных результата в следующей программе.

Вот тестовая программа:

#include <stdio.h> 
int main(void) 
{ 
    const char text[] = "0x01 1"; 
    unsigned int first_value = 0U; 
    unsigned int second_value = 0U; 
    signed int arguments_satisfied = 0; 
    arguments_satisfied = sscanf(text, "%u %u", &first_value, &second_value); 
    printf("Arguments scanned: %d, first: %d, second: %d\n", 
     arguments_satisfied, first_value, second_value); 
    return EXIT_SUCCESS; 
} 
+1

Другая причина (если это было необходимо) не полагаться на cplusplus.com. Не пробовав машину обратного пути, я проследил спецификацию «u/d десятичные, x - hex, o - восьмеричный, i - общий» для форматов scanf обратно в posix 5 (1997): http://pubs.opengroup.org/ onlinepubs/7908799/xsh/fscanf.html, но я уверен, что он возвращается еще дальше. http://en.cppreference.com/w/ лучше, но если у вас есть сомнения, стандарт лучше. – rici

ответ

3

Согласно действующему стандарту C, С11, 7.21.6.2/12, только %i выводит базу из контекста, все другие спецификаторы исправить базу:

i Соответствует необязательно целое число, чей формат такой же, как и ожидалось для объекта последовательности функции strtol с значением 0 для base аргумент. Соответствующим аргументом должен быть указатель на целое число .

o Соответствует необязательно восьмеричное целое число, чей формат такой же, как ожидается, для объекта последовательности функции strtoul с значением 8 для base аргумента. Соответствующим аргументом должен быть указатель на целое число без знака .

u Соответствует необязательно десятичное целое число, чей формат такой же, как ожидается, для объекта последовательности функции strtoul с значением 10 для base аргумента. Соответствующим аргументом должен быть указатель на целое число без знака .

x Соответствует необязательно шестнадцатеричное целое число, чей формат такой же, как и ожидалось для объекта последовательности функции strtoul с значением 16 для base аргумента. Соответствующим аргументом должен быть указатель на целое число без знака .