В чем проблема?
Огромное значение при вводе буквы потому, что scanf()
не распознает букву как допустимый ввод для целого числа и прекращает чтение, оставляя оставшиеся переменные неназначенными.
Как это решить?
Сначала проверьте, прочитали ли вы столько переменных, сколько ожидали:
if (scanf("%d.%d.%d.%d",&IP_1,&IP_2,&IP_3,&IP_4)<4) {
printf ("Error: invalid format !\n");
}
Затем вы можете прочитать целое число в шестнадцатеричном формате:
scanf("%x.%x.%x.%x",&IP_1,&IP_2,&IP_3,&IP_4);
Подробнее о форматировании ввода вы можете узнать scanf()
здесь
Важное замечание: Соглашение для адреса IPv4 заключается в использовании точек для разделения десятичных компонентов. Для шестнадцатеричного обозначения цифры в принципе последовательны, каждый компонент состоит из 2 цифр.
Редактировать
Если вам не разрешено использовать %x
, ни массивы, ни строки, тогда вы можете вводить только шестнадцатеричные цифры в виде символов. Предполагая, что каждая шестнадцатеричная часть вводится из 2 цифр, вам может потребоваться ввести 8 символов:
char c1, c2, c3, c4, c5, c6, c7, c8;
scanf("%c%c.%c%c.%c%c.%c%c",&c1, &c2, &c3, &c4, &c5, &c6, &c7,&c8);
// are you sure you have to enter the dots ?
Чтобы преобразовать два шестнадцатеричных символа в int, без использования строк и массивов вы можете сделать:
if (c1>='A' && c1<='F')
IP_1 = c1-'A';
else if (c1>='0' && c1<='9')
IP_1 = c1-'0';
else
IP_1 = 0; // OUCH! THIS IS AN ERROR
IP_1 = IP_1 *16;
if (c2>='A' && c2<='F')
IP_1 = IP_1 + c2-'A';
else if (c2>='0' && c2<='9')
IP_1 = IP_1 + c2-'0';
else
IP_1 = 0; // OUCH! THIS IS AGAIN AN ERROR
Я позволю вам в качестве упражнения добавить случай, когда цифры состоят из строчных букв. Я позволю вам завершить для всех персонажей, так как вам не разрешено создавать функции.
Финальное замечание
Выполнение упражнений, которые вынуждают студентов резать во всем мире принятые соглашения об IP-адресах, а затем заставлять студентов копировать код вставки, кажется мне очевидными признаками совершенно некомпетентного учителя.
В ваших интересах, вы не должны быть такими же прозрачными и открытыми, как я. Тем не менее, я чувствую себя обязанным предупредить вас: найдите несколько хороших уроков в Интернете. Или купите K & R и выполните все упражнения, содержащиеся в нем. Вы научитесь настоящим навыкам вместо того, чтобы брать вредные привычки.