Я пытаюсь преобразовать из шестнадцатеричного или десятичного текста в 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;
}
Другая причина (если это было необходимо) не полагаться на 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