Напишите программу на C, чтобы прочитать адрес IPv4 и проверить его правильность. - PullRequest
0 голосов
/ 10 мая 2018

Я знаю, что моя ошибка в расположении {}, но не могу сказать, где.Я пытался это исправить в течение часа.Я не уверен, что с моим кодом что-то не так.Кроме того, я новичок в программировании, поэтому, пожалуйста, детка, если сможешь.

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

int main (void)
{
    int ch, dots, bytes, temp;
    dots = bytes = temp = 0;
    printf ("Enter IP address (x.x.x.x): ");
    while ((ch = getchar ()) != '\n' && ch != EOF) {
        if (ch < '0' || ch != EOF) {
            if (ch == '.') {
                dots++;
            }
            if (temp != -1) {
                if (temp > 255) {
                    printf
                        ("Error: The value of each byte should be in [0,255]\n");
                    return 0;
                }

                bytes++;
                temp = -1;      //The value -1 means current address byte is checked
            } else {
                printf ("Error: Acceptable chars are only digits and dots\n");
                return 0;
            }
        } else {
            if (temp == -1)
                temp = 0;       //Make it 0, to start checking the next address byte
            temp = 10 * temp + (ch - '0');
        }
        if (temp != -1)         //Check the value of the last address byte
        {
            if (temp > 255) {
                printf
                    ("Error: The value of each byte should be in [0, 255]\n");
                return 0;
            }
            bytes++;
        }
    }
    if (dots != 3 || bytes != 4) {
        printf ("Error: The IP format should be x.x.x.x\n");
    }
    return 0;
}

1 Ответ

0 голосов
/ 10 мая 2018

Ваш код фактически компилируется, у вас ошибка в логике. Вам нужно будет потратить немного времени на отладчик, см. Как отлаживать небольшие программы - ИЛИ - вы можете немного упростить себе жизнь ...

Ваша задача не сложная, если вы просто подойдете к ней по-другому. Вы только проверяете, существуют ли периоды '.' между 4 октетами по 3 числа в каждом. (IPv4-адрес, ласково обозначаемый как пунктирный квадрат ). Если это единственные тесты, которые вы проводите, вы можете просто позволить sscanf сделать это за вас. Затем вам нужно только проверить, что значения находятся между 0 и 255.

(вы также можете захватить 1-й символ после последнего четырехугольника и проверить, что это символ '\n', чтобы убедиться, что на конце IP не добавлены посторонние символы)

Это значительно упрощает логику (и количество времени, которое вы будете проводить с отладчиком). Реализуя приведенную выше логику, вы можете сократить свой код до следующего и при этом использовать правильный fgets, за которым следует sscanf, например,

#include <stdio.h>

#define QUAD  4     /* if you need a constant define one (or more) */
#define MAXC 32     /* don't skimp on buffer size */

int main (void)
{
    char buf[MAXC] = "",    /* buf to hold IP read by fgets */
        nl = 0;             /* charater to validate newline following IP */
    int ip[QUAD] = {0};     /* array to store each quad for testing */

    printf ("Enter IP address (x.x.x.x): ");
    if (fgets (buf, MAXC, stdin)) {         /* read IP into buf */
        if (sscanf (buf, "%d.%d.%d.%d%c",   /* parse with sscanf */
                    &ip[0], &ip[1], &ip[2], &ip[3], &nl) != 5) {
            fprintf (stderr, "error: invalid IPv4 format.\n");
            return 1;
        }
        for (int i = 0; i < QUAD; i++)      /* loop over each quad */
            if (ip[i] < 0 || 255 < ip[i]) { /* validate 0-255 */
                fprintf (stderr, "error: invalid quad '%d'.\n", ip[i]);
                return 1;
            }
    }

    if (nl != '\n') {   /* validate following char is '\n' */
        fprintf (stderr, "error: additional characters following IP.\n");
        return 1;
    }

    printf ("valid IP: %s", buf);   /* all tests passed - good address */

    return 0;
}

Пример использования / Вывод

$ ./bin/chkip
Enter IP address (x.x.x.x): 12.23.34.45
valid IP: 12.23.34.45

$ ./bin/chkip
Enter IP address (x.x.x.x): 12.23.34.45a
error: additional characters following IP.

$ ./bin/chkip
Enter IP address (x.x.x.x): 12.23.34.450
error: invalid quad '450'.

$ ./bin/chkip
Enter IP address (x.x.x.x): 12.32.foo
error: invalid IPv4 format.

Посмотрите вещи и дайте мне знать, если у вас есть дополнительные вопросы. Если вы должны использовать getchar(), это выполнимо, но мне нужно будет найти немного аспирина, прежде чем пробираться с вами через каждый бит вашей логики цикла. Дайте мне знать, если это так.

...