Функция, которая проверяет, если в строке маска подсети действует


Я написал небольшую вспомогательную функцию, которая принимает строку и проверяет, если он переводится на допустимое значение маски подсети (255.255.255.0 например).

Я был бы признателен некоторые коллегиального обзора!

static bool isValidSubnetMask(IN char *subNetMask)
{
    char *str = NULL;
    char *endptr;
    int counter = 0;
    long int nChainInstance = -1;

    /*Check if string is valid*/
    if (!subNetMask || subNetMask[0] == '\0' || strlen(subNetMask) > 15) {
        return false;
    }

    /*Check string validity*/
    str = strtok(subNetMask, ".");
    while (str != NULL) {
        if (!is_numeric(str)) {
            return false;
        } else {
            /*Save number to be used as entry*/
            nChainInstance = strtol(str, &endptr, 10);
            if (str == endptr) {
                /*Fail to translate string to number*/
                return false;
            }
            if (nChainInstance > 255 || nChainInstance < 0) {
                return false;
            }
        }
        counter++;
        str = strtok(NULL, ".");
    }

    if (counter == 4) {
        return true;
    }
    return false;
}


318
4
задан 20 марта 2018 в 02:03 Источник Поделиться
Комментарии
1 ответ

Отсутствующие включает в себя

#include <stdbool.h>
#include <string.h>

Другие испытания могут быть необходимы

@Wingblade

Нестандартные функции

is_numeric() Не стандартные библиотеки C и не найти его в Linux.

Сомнительные подписи

Я бы ожидать, что функция, которая проверяет строку действия, чтобы справиться с const char * subNetMask. Таким образом, используя strtok() на прилагаемом subNetMask это не возможно. Код должен копировать или иным образом оценить строку.

// isValidSubnetMask(IN char *subNetMask)
isValidSubnetMask(IN const char *subNetMask)

Слабая функциональность

Ниже представлены 7 тестов, которые не код ОП. Образец рабочего кода. sscanf() немного тяжелый, но полезный в качестве теста конкурента.

bool is_numeric() {  // Added undefined Op's missing function.
return true;
}

static bool isValidSubnetMask2(const char *subNetMask) {
int n = 0;
sscanf(subNetMask, "%*3[0-9].%*3[0-9].%*3[0-9].%*3[0-9]%n", &n);
if (n == 0 || subNetMask[n]) {
return false;
}
int i[4];
sscanf(subNetMask, "%d.%d.%d.%d", &i[0], &i[1], &i[2], &i[3]);
return i[0] <= 255 && i[1] <= 255 && i[2] <= 255 && i[3] <= 255;
}

void test(bool expect, const char *s) {
char buff[99];
strcpy(buff, s);
bool y = isValidSubnetMask(buff);
if (y != expect) {
printf("Failed %d <%s>\n", expect, s);
}
y = isValidSubnetMask2(s);
if (y != expect) {
printf("Oops %d <%s>\n", expect, s);
}
}

int main() {
test(1, "255.255.255.0");
test(1, "255.255.255.123");
test(1, "0.0.0.0");
test(0, "455.255.255.0");
test(0, "255.255.255.-0");
test(0, "255.255.255. 0");
test(0, "2.2.5.2.3");
test(0, "2.2.3");
test(0, "+2.5.2.3");
test(0, "A.5.2.3");
test(0, "2.2.5.2.");
test(0, "2..2.5.2");
return 0;
}

Выход

Failed 0 <255.255.255.-0>
Failed 0 <255.255.255. 0>
Failed 0 <2.2.5.2.3>
Failed 0 <2.2.3>
Failed 0 <+2.5.2.3>
Failed 0 <2.2.5.2.>
Failed 0 <2..2.5.2>

2
ответ дан 24 марта 2018 в 02:03 Источник Поделиться