как получить несколько символов в одном входе в C - PullRequest
0 голосов
/ 17 марта 2019

Я новичок в программировании на C, поэтому я пытаюсь написать кусок кода, где мне нужно взять IP-адрес в шестнадцатеричном формате, но я не мог понять, как это сделать. насколько я знаю, я не могу получить множественный ввод с char , но с int , когда пользователь вводит 'A', например, получается огромное количество. для десятичных входов я написал что-то вроде этого

int main(){
    int IP_1,IP_2,IP_3,IP_4;
    printf("Enter the IP address:\n");
    scanf("%d.%d.%d.%d",&IP_1,&IP_2,&IP_3,&IP_4);

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

edit: извините, что не добавил это, я не могу использовать ни шестнадцатеричный% x, ни массивы / строки

Ответы [ 3 ]

0 голосов
/ 17 марта 2019

Я думаю, что лучший способ - прочитать строку, а затем использовать уже существующие функции для преобразования строки в IP (а именно, inet_aton()). Кроме того, я бы избегал scanf для строк, это небезопасно.

См. https://ideone.com/aO9Nll для демонстрации и кода в реальном времени.

0 голосов
/ 17 марта 2019
#include <stdio.h>

int main () {

unsigned int IP_1,IP_2,IP_3,IP_4; 

printf("Enter the IP address:\n");
scanf("%x %x %x %x",&IP_1,&IP_2,&IP_3,&IP_4); //storing in Hex format

printf("%x %x %x %x",IP_1,IP_2,IP_3,IP_4); 

}

0 голосов
/ 17 марта 2019

В чем проблема?

Огромное значение при вводе буквы потому, что 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 и выполните все упражнения, содержащиеся в нем. Вы научитесь настоящим навыкам вместо того, чтобы брать вредные привычки.

...