elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
29 Mayo 2012, 02:58  


Tema destacado: Entra al canal IRC oficial de #elhacker.net

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  Programa que guarda una ip entrada por linea de comando en una variable de 32b
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Programa que guarda una ip entrada por linea de comando en una variable de 32b  (Leído 271 veces)
Leon8086x

Desconectado Desconectado

Mensajes: 122


Ver Perfil
Programa que guarda una ip entrada por linea de comando en una variable de 32b
« en: 1 Octubre 2011, 02:04 »

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.



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


« Última modificación: 1 Octubre 2011, 13:07 por Eternal Idol » En línea
LearningSpanishProgrammer

Desconectado Desconectado

Mensajes: 67


Ver Perfil
Re: Programa que guarda una ip entrada por linea de comando en una variable de 32b
« Respuesta #1 en: 1 Octubre 2011, 23:56 »

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
Código:

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

Eso es muy malo, el strlen tiene O(n) de complejidad
Código:
for (...; strlen(argv[1]); ...)

See atoi
Código:
int atonum(int numero)

Eso no esta claro
Código:
if (numero == 46)
{
    n = 46;
} // si el caracter es un punto se retorna el mismo valor

eso es mejor
Código:
// 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
Código:
return (n)


« Última modificación: 2 Octubre 2011, 00:04 por LearningSpanishProgrammer » En línea

Estoy aprendiendo español, y tu estas aprendiendo programación
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Inquietud con linea de entrada
Hardware
kichan 2 311 Último mensaje 4 Mayo 2006, 21:25
por kichan
PHP, definir variable y agregar linea
PHP
dackmor 2 925 Último mensaje 11 Noviembre 2006, 18:36
por Sr. K€lthuzad
Borrar una línea de entrada en BOOT.INI
Dudas Generales
STEP 7-200 3 3,502 Último mensaje 16 Julio 2009, 18:04
por STEP 7-200
Como hago para que mi programa acepte argumentos por linea de comando? (VB.Net)
.NET
70N1 5 3,409 Último mensaje 30 Enero 2010, 19:12
por LastDragon
Leer de la entrada estandar linea por linea « 1 2 »
Programación C/C++
Delraich 15 2,124 Último mensaje 6 Julio 2010, 19:53
por MIG80
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines