sscanf %u не интерпретирует шестнадцатеричное

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

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

Согласно Harbison & Steele, 3-е издание:
Преобразование u Десятичное преобразование без знака выполняется.... Формат прочитанного числа совпадает с ожидаемым для ввода в 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 ответ

Решение

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

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

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

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

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

Другие вопросы по тегам