Как определить, является ли число между coma (.) >= 0 и <= 255?

#c #detection #ipv4

#c #обнаружение #ipv4

Вопрос:

например, для определения адреса ipv4: 255.255.1.0 = true 277.255.1.0 = false, потому что 277 больше 255, как мне определить это для каждого числа, разделенного comas? У кого-нибудь есть идея?

Комментарии:

1. Что вы пробовали до сих пор?

2. Например, вы можете использовать оператор less-than .

3. Вы могли бы использовать регулярное выражение.

4. Я ничего не пробовал, потому что я не знаю, что бы я сделал, если бы кто-то набрал 001, как мне преобразовать это в целое число со значением 1. Кстати, весь адрес состоит из 1 строки.

5. Вместо того, чтобы анализировать числа вручную, почему бы не использовать существующую функцию, специально разработанную для анализа IP-адресов? Например inet_addr() , inet_pton() , getaddrinfo() , и т.д.

Ответ №1:

Вы можете разделить свою строку на четыре числа с помощью sscanf функции из <cstdio> заголовка следующим образом:

     std::string test = "1.1.1.1";
    int numbers[4];
    //Check if returned value is 4 if you aren't sure the input is in the right format
    sscanf( test.c_str(), "%i.%i.%i.%i", amp;numbers[0], amp;numbers[1], amp;numbers[2], amp;numbers[3] );
 

После этого вы можете выполнить итерацию массива для проверки на наличие недопустимых чисел или использовать <algorithm> :

     bool valid = std::none_of( a, a   4, []( int i ){ return ( i < 0 ) || ( i > 255 ); });
 

Однако, если вы пишете что-то, связанное с сетью, я бы просто проверил возвращаемое значение inet_pton , поскольку вы, вероятно, все равно вызовете эту функцию, и она вернет 1 в случае успеха и 0, если предоставленная строка не является допустимым адресом.

Комментарии:

1. !std::any_of это то, что std::none_of делает.