Programa que guarda una ip entrada por linea de comando en una variable de 32b

Iniciado por Leon8086x, 1 Octubre 2011, 02:04 AM

0 Miembros y 1 Visitante están viendo este tema.

Leon8086x

Bueno eso esto es un Programa que pasa una ip por linea de comando y la manda a una variable de 32 bit.

Sin mas aquí el código.





#include <stdio.h>
#include <string.h>

int atonum (int numero);


main(int argc, char *argv[])
{
unsigned int a=0;
unsigned int b=0;
unsigned int c=0;
unsigned int d=0;
int cont=0;
int tri=0;
int i=0;
long int ipn;
char *s;

if(argc!=2)
{
printf("Error en la introduccion de la direccion ip\n");
return(0);
}
             
             
if (strlen(argv[1])>15) // Me fijo que el string de entrada no posea
                       //mas de 15 caracteres, el maximo posible 3
                       //puntos mas 12 numeros 15 caracteres total
{
printf ("no es una ip valida");
return (0);
}

// me fijo que todos los craracteres que componene el string sean validos
//para una direccion ip

for (i=0;i<(strlen(argv[1]));i++)
{

if (atonum(argv[1][i])==-1 )
{
printf("\t el elemento \t %d \t es  \t %c ERROR ",i,argv[1][i]);
printf("\n \t este elemento es invalido para una direccion ip \n");
return(0);
}
if (atonum(argv[1][i])!=-1 )
{
printf("\t el elemento \t %d \t es  \t %c ok \n  ",i,argv[1][i]);
}

}

i=0;

//me fijo que la cantidad de campos sea 4

for (i=0;i<(strlen(argv[1]));i++)
{
if (atonum(argv[1][i])==46 )
{
cont++;
}
if (cont>3 )
{
printf ("\n \n \t Error en el formato de la ip \n \n \t demasiado campos \n");

return (0);
}
}

i=0;
cont=0;

// me fijo que todos los campo no posean mas de 3 numeros

for (i=0;i<(strlen(argv[1]));i++)
{
if (atonum(argv[1][i])!=46)
{
if (cont>=3)
      {
      printf("error en el formato de la ip uno de los campos esta exedido");
      }
cont++;
}

if (atonum(argv[1][i])==46)
{
cont=0;
}


}



sscanf(argv[1],"%u.%u.%u.%u",&a,&b,&c,&d);


printf ("\n\t %u.%u.%u.%u \n",a,b,c,d);
printf ("\n\t en exadecimal %x.%x.%x.%x \n",a,b,c,d);


if (a>256 || b>256 || c>256 || d>256  )

{
printf ("\n \t Error uno de los campos es mayor a 256 \n");
return(0);
}

printf ("\n\t la direccion ip sera pasada a una variable de 32 bits ipn \n");

ipn=(a<<24)+(b<<16)+(c<<8)+d;

printf ("\n\t la direccion ip ahora esta en ipn %x \n",ipn);




}


int atonum (int numero)
                       {
                        int n;
                        if ( (numero-48)>=0 && (numero-48)<=9) {n=numero-48;}
                        if ( numero==46) {n=46;} // si el caracter es un punto se retorna el mismo valor
                        if ((numero-48)<0 && (numero-48)>9) {n=-1;}
                        return (n);
                        }






Espero criticas, opiniones, correcciones (que ya estoy viendo varias para hacer pero bueno).

Desde ya muchas gracias por su tiempo y colaboración.

EI: juntando mensajes.

Por cierto me olvidaba, compilado en código c en bloodshed  dev c++ 3.99.  ::)

LearningSpanishProgrammer

#1
Generale:

Su sangría (indentation) no es buena, por favor, debe centrarse más en el formato.

Números sin contexto (e.g. 48?) no son buenos.

Su código esta bueno, pero tienes mucho que mejorar! Ese es el camino.

Personalmente, empezaría por la búsqueda del índices de los puntos. Después, usaria 'atoi' en todos los numeros entre {0, punto1}; {punto1 + 1, punto2} ... {punto3 + 1, tamaño}

Específico:

El int es necesario en una función main

int main(int argc, char *argv[])


Eso es muy malo, el strlen tiene O(n) de complejidad

for (...; strlen(argv[1]); ...)


See atoi

int atonum(int numero)


Eso no esta claro

if (numero == 46)
{
   n = 46;
} // si el caracter es un punto se retorna el mismo valor


eso es mejor

// si el caracter es un punto se retorna el mismo valor
if (numero == '.')
{
   n = '.';
}


No debe usar parentheses en el return se no és necesario
return (n)
Estoy aprendiendo español, y tu estas aprendiendo programación