Ваш код фактически компилируется, у вас ошибка в логике. Вам нужно будет потратить немного времени на отладчик, см. Как отлаживать небольшие программы - ИЛИ - вы можете немного упростить себе жизнь ...
Ваша задача не сложная, если вы просто подойдете к ней по-другому. Вы только проверяете, существуют ли периоды '.'
между 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()
, это выполнимо, но мне нужно будет найти немного аспирина, прежде чем пробираться с вами через каждый бит вашей логики цикла. Дайте мне знать, если это так.