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. ::)
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)