При использовании printf для char выводятся только точки - PullRequest
1 голос
/ 12 марта 2019

В настоящее время я работаю над домашней работой и не могу получить желаемый результат из приведенного ниже кода.

#include <stdio.h>

int main() {
    int base, num, x, y, z, t, choice;
    char hexa = 0, a, b, c, d, k, l, m, n, h, g, f, v;

    switch (hexa) {
    case 'A':
        num = 10;
        break;
    case 'B':
        num = 11;
        break;
    case 'C':
        num = 12;
        break;
    case 'D':
        num = 13;
        break;
    case 'E':
        num = 14;
        break;
    case 'F':
        num = 15;
        break;
    }

    printf("Please enter the base:\n");
    scanf("%d", &base);

    if (base == 10) {
        printf("Please enter your ip address:\n");
        scanf("%c.%c.%c.%c", &a, &b, &c, &d);

        //if((a<0 || a>255) && (b<0 || b>255) && (c<0 || c>255) && (d<0 || d>255)){ //FIX THIS
        //  printf("Sorry, that is not a valid address!");}
        printf("Please enter the sub-net mask\n"); //Skips this line
        scanf("%d.%d.%d.%d", &x, &y, &z, &t);
    }
    else if (base == 16) {
        printf("Enter your ip address\n");
        scanf("%c.%c.%c.%c", &k, &l, &m, &n);
        printf("Enter the subnet mask\n");
        scanf("%c.%c.%c.%c", &h, &g, &f, &v);
    }

    scanf("%d", &choice);

    if (choice == 1) { //there is a part that asks which 
        printf("%c.%c.%c.%c", a, b, c, d); //prints only dots
    }
    else if (choice == 2) {}
    else if (choice == 3) {}
    else if (choice == 4) {}
    else if (choice == 5) {}
    else if (choice == 6) {}

    return 0;
}

Поэтому в основном я пытаюсь получить IP-адрес и подсеть и преобразовать их вдвоичный файл, но в соответствии с инструкциями я не могу использовать битовое смещение и %x, чтобы получить IP-адрес в качестве базы 16. Проблема заключается в том, что я пытаюсь напечатать IP-адрес, указанный printf, печатает только точки и ничего больше.А также один из пропусков маски подсети scanf.Я был бы очень рад получить помощь от вас, ребята, потому что у меня не так много друзей, чтобы задавать вопросы.Спасибо.

РЕДАКТИРОВАТЬ : Я не знаю, столкнется ли кто-нибудь с этой проблемой, но мое решение было довольно глупым, но оно работает.Вы в основном принимаете входные данные как scanf("%c%c.%c%c.%c%c.%c%c%c"), последний %c предназначен для ввода, поскольку char принимает входные данные в качестве ввода.

Ответы [ 2 ]

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

В вашем коде несколько проблем:

  • Оператор switch бесполезен, поскольку hexa имеет постоянное значение, а num не используется в любом случае.

  • Вы должны разобрать десятичные числа с %d, %u или %i и шестнадцатеричные числа с %x.

  • Если вы настаиваете насохраняя le IP-селекторы в байтах, вы должны использовать unsigned char вместо простого char и использовать %hhu и %hhx соответственно.

  • Тест на достоверность номера неверен,ошибочно иметь любое число вне диапазона 0..255, поэтому между всеми тестами требуется ||.

  • компоненты IP следует печатать с %d, а не %c: %c вывод символов, а не цифр.Эти символы, вероятно, не могут быть напечатаны, поэтому отображаются только точки.

Вот модифицированная версия:

#include <stdio.h>

int main() {
    int base, a, b, c, d, x, y, z, t, n, choice;

    printf("Please enter the base: ");
    if (scanf("%d", &base) != 1)
        return 1;

    if (base != 10 && base != 16) {
        printf("invalid base\n");
        return 1;
    }

    printf("Please enter your IP address: ");
    if (base == 10) {
        n = scanf("%d.%d.%d.%d", &a, &b, &c, &d);
    } else {
        n = scanf("%x.%x.%x.%x", &a, &b, &c, &d);
    }
    if (n != 4) {
        printf("invalid input\n");
        return 1;
    }
    if (a < 0 || a > 255 || b < 0 || b > 255 || c < 0 || c > 255 || d < 0 || d > 255) {
        printf("invalid IP address\n");
        return 1;
    }
    printf("Please enter the sub-net mask: ");
    if (base == 10) {
        n = scanf("%d.%d.%d.%d", &x, &y, &z, &t);
    } else {
        n = scanf("%x.%x.%x.%x", &x, &y, &z, &t);
    }
    if (n != 4) {
        printf("invalid input\n");
        return 1;
    }
    if (x < 0 || x > 255 || y < 0 || y > 255 || z < 0 || z > 255 || t < 0 || t > 255) {
        printf("invalid sub-net mask\n");
        return 1;
    }

    if (scanf("%d", &choice) != 1) {
        printf("invalid input\n");
        return 1;
    }
    switch (choice) {
      case 1:
        printf("%d.%d.%d.%d\n", a, b, c, d);
        break;
      case 2:
      case 3:
      case 4:
      case 5:
      case 6:
        break;
    }
    return 0;
}

Обратите внимание, что существует способ сжать валидностьтест:

    if (((a | b | c | d) & ~255U) {
        printf("invalid IP address\n");
        return 1;
    }
0 голосов
/ 14 марта 2019

Привет и добро пожаловать в stackoverflow!

Мой ответ поможет вам только в части базовых 16, потому что вы можете легко сделать базовые 10 на основе того, чего вы уже достигли, и некоторых подсказок, которые я вам даю.

Разбор с использованием базы 16

Как вы упомянули, вы не можете использовать% x для получения IP-адреса, поэтому другая возможность - использовать строки. IP-адрес состоит из цифр от 0 до 255, поэтому вы можете ожидать шестнадцатеричные символы от 0x00 до 0xFF.

Для меня лучший способ добиться этого - использовать scanset с функцией scanf:

scanf("%2[0-9A-F]", str);

Pattern% 2 [0-9A-F] означает, что scanf ожидает не более двух символов, которые должны быть любыми цифрами или заглавными буквами между A и F (т.е. любым шестнадцатеричным символом). Обратите внимание, что длина строки должна быть 3 для хранения 2 символов + нулевой терминатор \0.

Затем буфер str будет заполнен символами ASCII, представляющими собой шестнадцатеричное представление IP-адреса. Вы можете использовать функцию strtol для преобразования строки шестнадцатеричного представления в целое число.

Полный код ниже:

#include <stdio.h>
#include <stdlib.h> // strol

#define DIGIT_SIZE 3 // 2 hex digit + null character

int main(void) {

    char d1[DIGIT_SIZE];
    char d2[DIGIT_SIZE];
    char d3[DIGIT_SIZE];
    char d4[DIGIT_SIZE];

    scanf("%2[0-9A-F].%2[0-9A-F].%2[0-9A-F].%2[0-9A-F]", d1, d2, d3, d4);

    printf("hex ip:[%s.%s.%s.%s]\n", d1, d2, d3, d4);

    int i1 = (int)strtol(d1, NULL, 16);
    int i2 = (int)strtol(d2, NULL, 16);
    int i3 = (int)strtol(d3, NULL, 16);
    int i4 = (int)strtol(d4, NULL, 16);

    printf("dec ip:[%d.%d.%d.%d]\n", i1, i2, i3, i4);

    return 0;
}

Несколько попыток на моей стороне:

$ 8.8.8.8  
$ hex ip:[8.8.8.8]
$ dec ip:[8.8.8.8]

$ A.B.C.D
$ hex ip:[A.B.C.D]
$ dec ip:[10.11.12.13]

$ FF.FF.FF.FF
$ hex ip:[FF.FF.FF.FF]
$ dec ip:[255.255.255.255]

$ 0.0.0.0
$ hex ip:[0.0.0.0]
$ dec ip:[0.0.0.0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...