Попытка сохранить недопустимое шестнадцатеричное число в переменной int - PullRequest
0 голосов
/ 02 мая 2020

У меня очень базовое c сомнение. Я пытаюсь сохранить любое недопустимое шестнадцатеричное число в переменной int. Под недействительным числом я подразумеваю число, которое использует алфавиты, которые не находятся в диапазоне A-F. Например, см. Эту программу:

#include<stdio.h>
int main()
{
    int a;
    scanf("%X",&a);
    printf("%d",a);
    return 0;
}

Когда консоль запрашивает ввод, я ввел G. Это дало вывод как 63. Это просто неопределенное поведение или за этим выводом есть логика c. Для большинства таких входов выходной сигнал имеет вид 63. В данный момент работаю над G CC.

1 Ответ

1 голос
/ 02 мая 2020
 scanf("%X",&a);

%X будет искать только шестнадцатеричный ввод. Если вы введете G, директива потерпит неудачу, и присвоение a не произойдет. В этом случае scanf() возвращает 0, которое указывает количество успешно использованных элементов.

Необходимо проверить, все ли элементы были успешно использованы, проверив возвращаемое значение scanf():

if(scanf("%X",&a) != 1) {
    fprintf(stderr, "Error occurred at scanning hexadecimal input!");
}

"Когда консоль запрашивает ввод, я ввел G. Она выдала вывод как 63. Это просто неопределенное поведение или за этим стоит какая-то логика c output? "

Поскольку a неинициализирован:

int a;

, и при вызове scanf() не было успешно выполнено потребление, которое назначило бы разумное значение в a, a по-прежнему содержит значение мусора, поскольку оно является объектом с продолжительностью хранения auto mati c по умолчанию.

Чтобы напечатать это значение мусора, вызовет действительно неопределенное поведение.

...