Ответ 1
Стандарт, похоже, написан таким образом:
-
%#x
и%#o
постарайтесь гарантировать правильную обработку вывода с помощьюstrtol
с помощьюbase = 0
. -
В этих случаях флаг
#
добавляет как можно больше лишних символов. Например, 0 печатается как0
, потому что нет необходимости добавлять дополнительные0x
. Это имеет большой смысл, если вы не указали минимальную ширину поля и 0-дополнение. -
Если вы хотите добавить
0x
всегда, вы можете просто написать что-то вроде0x%x
. Следовательно,%#x
может показаться полезным только в тех особых случаях, когда вам действительно нужна специальная обработка 0. Но предварительный запрос0x
не работает с спецификаторами ширины поля по умолчанию, например)0x%12x
право оправдано пробелами между 0x и шестнадцатеричными цифрами, что вряд ли будет тем, что нужно в этом случае. Для этого случая потребуется дополнительный подготовительный проход с помощью sprintf, поэтому шестнадцатеричная строка, такая как"0x2ac2"
, может быть свободным пробелом, оправданным с чем-то вродеprintf( "%12s", hexstr);
К счастью, оправдывая0
, а не пробелы, используя что-то вродеprintf( "0x%012x", hexstr);
, работает как ожидая получения действительных шестнадцатеричных цифр для синтаксического анализатора.
Теперь путь %#x
указан для работы, который имеет большой смысл в изоляции. И, как указано, что-то вроде %010x
задается для работы, имеет большой смысл в изоляции. Вы комбинируете эти два модификатора, и конечный результат, возможно, странный. Для другого приложения, такого как автоматическое генерирование аккуратного кода C для инициализации таблиц, наличие 0,
, а не 0x0
не является проблемой.
Но нет необходимости комбинировать %#x
и %010x
. Вы можете просто написать 0x%08x
, чтобы сделать то, что вы хотите.