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
аргумент. Соответствующий аргумент должен быть указателем на целое число без знака.