elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  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 1,507 veces)
Leon8086x

Desconectado Desconectado

Mensajes: 125


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

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
  1.  
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. int atonum (int numero);
  6.  
  7.  
  8. main(int argc, char *argv[])
  9. {
  10. unsigned int a=0;
  11. unsigned int b=0;
  12. unsigned int c=0;
  13. unsigned int d=0;
  14. int cont=0;
  15. int tri=0;
  16. int i=0;
  17. long int ipn;
  18. char *s;
  19.  
  20. if(argc!=2)
  21. {
  22. printf("Error en la introduccion de la direccion ip\n");
  23. return(0);
  24. }
  25.  
  26.  
  27. if (strlen(argv[1])>15) // Me fijo que el string de entrada no posea
  28.                        //mas de 15 caracteres, el maximo posible 3
  29.                        //puntos mas 12 numeros 15 caracteres total
  30. {
  31. printf ("no es una ip valida");
  32. return (0);
  33. }
  34.  
  35. // me fijo que todos los craracteres que componene el string sean validos
  36. //para una direccion ip
  37.  
  38. for (i=0;i<(strlen(argv[1]));i++)
  39. {
  40.  
  41. if (atonum(argv[1][i])==-1 )
  42. {
  43. printf("\t el elemento \t %d \t es  \t %c ERROR ",i,argv[1][i]);
  44. printf("\n \t este elemento es invalido para una direccion ip \n");
  45. return(0);
  46. }
  47. if (atonum(argv[1][i])!=-1 )
  48. {
  49. printf("\t el elemento \t %d \t es  \t %c ok \n  ",i,argv[1][i]);
  50. }
  51.  
  52. }
  53.  
  54. i=0;
  55.  
  56. //me fijo que la cantidad de campos sea 4
  57.  
  58. for (i=0;i<(strlen(argv[1]));i++)
  59. {
  60. if (atonum(argv[1][i])==46 )
  61. {
  62. cont++;
  63. }
  64. if (cont>3 )
  65. {
  66. printf ("\n \n \t Error en el formato de la ip \n \n \t demasiado campos \n");
  67.  
  68. return (0);
  69. }
  70. }
  71.  
  72. i=0;
  73. cont=0;
  74.  
  75. // me fijo que todos los campo no posean mas de 3 numeros
  76.  
  77. for (i=0;i<(strlen(argv[1]));i++)
  78. {
  79. if (atonum(argv[1][i])!=46)
  80. {
  81. if (cont>=3)
  82.       {
  83.       printf("error en el formato de la ip uno de los campos esta exedido");
  84.       }
  85. cont++;
  86. }
  87.  
  88. if (atonum(argv[1][i])==46)
  89. {
  90. cont=0;
  91. }
  92.  
  93.  
  94. }
  95.  
  96.  
  97.  
  98. sscanf(argv[1],"%u.%u.%u.%u",&a,&b,&c,&d);
  99.  
  100.  
  101. printf ("\n\t %u.%u.%u.%u \n",a,b,c,d);
  102. printf ("\n\t en exadecimal %x.%x.%x.%x \n",a,b,c,d);
  103.  
  104.  
  105. if (a>256 || b>256 || c>256 || d>256  )
  106.  
  107. {
  108. printf ("\n \t Error uno de los campos es mayor a 256 \n");
  109. return(0);
  110. }
  111.  
  112. printf ("\n\t la direccion ip sera pasada a una variable de 32 bits ipn \n");
  113.  
  114. ipn=(a<<24)+(b<<16)+(c<<8)+d;
  115.  
  116. printf ("\n\t la direccion ip ahora esta en ipn %x \n",ipn);
  117.  
  118.  
  119.  
  120.  
  121. }
  122.  
  123.  
  124. int atonum (int numero)
  125.                        {
  126.                         int n;
  127.                         if ( (numero-48)>=0 && (numero-48)<=9) {n=numero-48;}
  128.                         if ( numero==46) {n=46;} // si el caracter es un punto se retorna el mismo valor
  129.                         if ((numero-48)<0 && (numero-48)>9) {n=-1;}
  130.                         return (n);
  131.                         }
  132.  
  133.  
  134.  



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 pm 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 pm »

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 am 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
Problema con cambios d micro a linea d entrada en el control de grab. de Windows
Multimedia
MoisesioM 1 1,565 Último mensaje 2 Junio 2005, 12:34 pm
por MoisesioM
PHP, definir variable y agregar linea
PHP
dackmor 2 1,732 Último mensaje 11 Noviembre 2006, 18:36 pm
por Sr. K€lthuzad
Como hago para que mi programa acepte argumentos por linea de comando? (VB.Net)
.NET (C#, VB.NET, ASP)
70N1 5 10,688 Último mensaje 30 Enero 2010, 19:12 pm
por LastDragon
Leer de la entrada estandar linea por linea « 1 2 »
Programación C/C++
Delraich 15 9,402 Último mensaje 6 Julio 2010, 19:53 pm
por MIG80
Donde se guarda una variable?
Programación General
Senior++ 3 1,546 Último mensaje 19 Agosto 2012, 07:40 am
por sistemx
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines