Вы не можете использовать scanf("0x%x", &j)
для проверки ввода, а затем использовать scanf("0x%x", &num[i])
, чтобы ввести значение в num[i]
.scanf
потребляет символов, которые он принимает, поэтому их больше нет во входном потоке.Когда вы делаете второй scanf
, символы исчезают.
Вместо этого просто попробуйте отсканировать нужную вещь.Если это работает, вы сделали.Если это не работает, перейдите к else
:
if (scanf("0x%x", &num[i]) == 1)
; // Worked, nothing to do.
else if (scanf("0%o", &num[i]) == 1)
;
else if (scanf("%i", &num[i]) == 1)
;
else
{
// Nothing worked, should put error-handling code here.
}
Это на самом деле не очень хороший код для реальных приложений, потому что scanf
будет потреблять часть входных данных, даже если в конечном итоге произойдет сбой.Например, при scanf("0x%x", &num[i])
, если вход содержит «0x», но содержит не шестнадцатеричный символ, scanf
будет использовать «0x», но оставит следующий символ.Тем не менее, этого достаточно для обучения.
Если у вас есть значения в массиве num
, они являются просто int
значениями.Это математические значения, а не цифры в восьмеричном, десятичном или шестнадцатеричном формате.Вы можете напечатать их с %o
для восьмеричного или %d
или %i
для десятичного.Оригинальная цифра не имеет значения.При печати математическое значение будет использоваться для форматирования строки в запрошенной базе.
Не следует использовать %x
для печати int
, так как %x
для unsigned int
.Однако вы можете преобразовать int
в unsigned int
и затем распечатать его с %x
.
Обратите внимание, что вам не следует сканировать объекты с int
с %x
.%x
- для сканирования на unsigned int
объектов.На самом деле вы можете сканировать шестнадцатеричные, восьмеричные и десятичные числа, используя:
if (scanf("%i", &num[i]) == 1)
;
else
…
Спецификация %i
распознает шестнадцатеричные цифры, начинающиеся с «0x», восьмеричные цифры, начинающиеся с «0», и десятичные цифры.
Если вы не хотите использовать %i
для всех трех, потому что по какой-то причине вам нужен прямой контроль, вам нужно будет написать больше кода.Стандарт C не обеспечивает прямой способ сканирования только шестнадцатеричного числа в int
.Вам нужно будет получить символы из входных данных и вычислить их значение или отсканировать до unsigned int
, а затем преобразовать результат в int
.