#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
делает.