Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Leon8086x en 1 Octubre 2011, 02:04 am



Título: Programa que guarda una ip entrada por linea de comando en una variable de 32b
Publicado por: Leon8086x 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.  ::)


Título: Re: Programa que guarda una ip entrada por linea de comando en una variable de 32b
Publicado por: LearningSpanishProgrammer 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)