Programa para validar una dirección IP

Escriba un programa para validar una dirección IPv4. 
Según Wikipedia, las direcciones IPv4 se representan canónicamente en notación decimal de puntos, que consta de cuatro números decimales, cada uno de los cuales va del 0 al 255, separados por puntos, por ejemplo, 172.16.254.1

Los siguientes son pasos para verificar si una string determinada es una dirección IPv4 válida o no:

paso 1) Analizar string con «.» como delimitador usando la función “ strtok() ”. 

egptr = strtok(str, DELIM);

paso 2) 
A) Si ptr contiene cualquier carácter que no sea un dígito, devuelva 0 
B) Convierta «ptr» a un número decimal, diga ‘NUM’ 
C) Si NUM no está en el rango de 0-255, devuelva 0 
D) Si NUM está en rango de 0-255 y ptr no es NULL incrementa “dot_counter” en 1 
E) si ptr es NULL vaya al paso 3 de lo contrario vaya al paso 1
paso 3) si dot_counter != 3 devuelva 0 de lo contrario devuelva 1

C++

// Program to check if a given
// string is valid IPv4 address or not
#include <bits/stdc++.h>
using namespace std;
#define DELIM "."
 
/* function to check whether the
   string passed is valid or not */
bool valid_part(char* s)
{
    int n = strlen(s);
     
    // if length of passed string is
    // more than 3 then it is not valid
    if (n > 3)
        return false;
     
    // check if the string only contains digits
    // if not then return false
    for (int i = 0; i < n; i++)
        if ((s[i] >= '0' && s[i] <= '9') == false)
            return false;
    string str(s);
     
    // if the string is "00" or "001" or
    // "05" etc then it is not valid
    if (str.find('0') == 0 && n > 1)
        return false;
    stringstream geek(str);
    int x;
    geek >> x;
     
    // the string is valid if the number
    // generated is between 0 to 255
    return (x >= 0 && x <= 255);
}
 
/* return 1 if IP string is
valid, else return 0 */
int is_valid_ip(char* ip_str)
{
    // if empty string then return false
    if (ip_str == NULL)
        return 0;
    int i, num, dots = 0;
    int len = strlen(ip_str);
    int count = 0;
     
    // the number dots in the original
    // string should be 3
    // for it to be valid
    for (int i = 0; i < len; i++)
        if (ip_str[i] == '.')
            count++;
    if (count != 3)
        return false;
     
    // See following link for strtok()
   
    char *ptr = strtok(ip_str, DELIM);
    if (ptr == NULL)
        return 0;
 
    while (ptr) {
 
        /* after parsing string, it must be valid */
        if (valid_part(ptr))
        {
            /* parse remaining string */
            ptr = strtok(NULL, ".");
            if (ptr != NULL)
                ++dots;
        }
        else
            return 0;
    }
 
    /* valid IP string must contain 3 dots */
    // this is for the cases such as 1...1 where
    // originally the no. of dots is three but
    // after iteration of the string we find
    // it is not valid
    if (dots != 3)
        return 0;
    return 1;
}
 
// Driver code
int main()
{
    char ip1[] = "128.0.0.1";
    char ip2[] = "125.16.100.1";
    char ip3[] = "125.512.100.1";
    char ip4[] = "125.512.100.abc";
    is_valid_ip(ip1) ? cout<<"Valid\n" : cout<<"Not valid\n";
    is_valid_ip(ip2) ? cout<<"Valid\n" : cout<<"Not valid\n";
    is_valid_ip(ip3) ? cout<<"Valid\n" : cout<<"Not valid\n";
    is_valid_ip(ip4) ? cout<<"Valid\n" : cout<<"Not valid\n";
    return 0;
}
Producción

Valid
Valid
Not valid
Not valid

Complejidad temporal : O(n) 
Espacio auxiliar : O(1)

Este artículo fue compilado por Narendra Kangralkar . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Solución de Python: –

Enfoque : – Comprobaremos todos los casos en los que la dirección IP puede no ser válida

1. Primero dividiremos la entrada dada usando la función split() y luego verificaremos si tiene una longitud de 4 o no. Si la longitud no es igual a 4, devolveremos directamente 0.

2. En el segundo paso, verificaremos si algún elemento dividido contiene un cero inicial o no. Si es así, devolveremos cero.

3. Si alguna de las divisiones no contiene ningún número, entonces no es una dirección IP válida. Por lo tanto, devolveremos 0

4. Luego, verificaremos si todas las divisiones están en el rango de 0-255 o no. De lo contrario, devolveremos 0.

5. Finalmente, si ninguna de las condiciones anteriores es verdadera, finalmente podemos decir que es una dirección IP válida. Y devolveremos True.

Aquí está el código para el enfoque anterior.

Python3

def in_range(n):   #check if every split is in range 0-255
    if n >= 0 and n<=255:
        return True
    return False
     
def has_leading_zero(n): # check if eery split has leading zero or not.
    if len(n)>1:
        if n[0] == "0":
            return True
    return False
def isValid(s):
     
    s = s.split(".")
    if len(s) != 4:  #if number of splitting element is not 4 it is not a valid ip address
        return 0
    for n in s:
         
        if has_leading_zero(n):
            return 0
        if len(n) == 0:
            return 0
        try:  #if int(n) is not an integer it raises an error
            n = int(n)
 
            if not in_range(n):
                return 0
        except:
            return 0
    return 1
         
   
if __name__=="__main__":
     
     
    ip1 = "222.111.111.111"
    ip2 = "5555..555"
    ip3 = "0000.0000.0000.0000"
    ip4 = "1.1.1.1"
    print(isValid(ip1))
    print(isValid(ip2))
    print(isValid(ip3))
    print(isValid(ip4))
 
     
 # this code is contributed by Vivek Maddeshiya.
Producción

1
0
0
1

Complejidad temporal : O(n) 
Espacio auxiliar : O(1)

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *