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

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ayuda Run-time Failure stack around the variable ping was corrupted
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda Run-time Failure stack around the variable ping was corrupted  (Leído 2,817 veces)
Vurkolak

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Ayuda Run-time Failure stack around the variable ping was corrupted
« en: 2 Julio 2020, 01:51 am »

Muy buenas, tengo que realizar un ejercicio que me dice que tengo que leer una ruta de un fichero introducido por teclado para ver su contenido,el contenido trata de ips (esto ya esta realizado y funciona) luego me pide que ejecute un ping de las ips leidas y aquí al final es donde tengo el run-time evidentemente hay algo que no hago bien y se descontrola pero no soy capaz de resolver el error. Espero que alguien me pueda ayudar y así poder aprender de estos errores. Muchas gracias.

Código
  1. void leerFichero() {
  2. #define SIZE_IP 15
  3. char nombreFichero[256]; //declaramos una array de char para poder introducir la ruta con un máximo de 256 carcateres
  4. char caracter; // declaramos caracter para recoger caracter a caracter
  5. char ip[SIZE_IP]; // declaramos un array de 15 ya que el maximo de una ip es 255.255.255.255
  6. char ping[] = "ping";
  7. //int final = 0;
  8. FILE* miFichero; // declaramos el file como miFichero
  9.  
  10. printf("Escriba la ruta del fichero a visualizar: \n");
  11.  
  12. scanf("%s",&nombreFichero); // recogemos la ruta del archivo donde se abrirá
  13. miFichero = fopen(nombreFichero,"r"); //abrimos el fichero en modo lectura "r"
  14. if (miFichero == NULL) { // si el fichero no existe printamos un error
  15. printf("Error al abrir el fichero\n");
  16. }
  17. else
  18. {
  19. printf("\n**************************Lectura del fichero****************************\n\n"); //printamos el contenido del fichero
  20. caracter = fgetc(miFichero); //recoge caracter a caracter y lo almacena en caracter
  21. while (feof(miFichero)==0) // mientras no llegue al final del archivo printará por consola el contenido del fichero
  22. {
  23. printf("%c", caracter);
  24. caracter = fgetc(miFichero);
  25. }
  26. rewind(miFichero);
  27. printf("\n**************************Lectura de las IPs****************************\n\n");
  28.  
  29. //final=fscanf(miFichero, "%s", ip);
  30.  
  31. while (!feof(miFichero))
  32. {
  33. fgets(ip, SIZE_IP, miFichero);
  34.  
  35. //fscanf(miFichero, "%s", ip);
  36. //printf("variable ping: %s variable ip: %s", ping, ip);
  37. strcpy(ping, "ping ");
  38. system(strcat(ping, ip));
  39. }
  40. fclose(miFichero); //cerramos el fichero
  41. }
  42. fflush(stdin); //borramos la memoria
  43. //printf("Presione enter para salir \n");
  44. // getchar();
  45. }

MOD: Corregidas las etiquetas de Código GeSHi


« Última modificación: 2 Julio 2020, 03:52 am por YreX-DwX » En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Ayuda Run-time Failure stack around the variable ping was corrupted
« Respuesta #1 en: 2 Julio 2020, 04:01 am »

El problema más gordo está en la línea 38. No puedes pasar la cadena concatenada sin antes guardarla en una variable. Es por esto que se corrompe la pila y te sale ese error.

Además de eso, cuidado con la longitud para la IP. Utilizas una longitud de 15 porque la ip más larga es de 15 caracteres pero no estás teniendo en cuenta el caracter de fin de cadena ('\0'). Cuando utilizas fgets() e indicas SIZE_IP, la función guarda hasta un máximo de (SIZE_IP - 1) caracteres; puesto que el último lo reserva para el de fin de cadena.

Y para las cadenas evita usar scanf(), fscanf() y similares. Es preferible usar siempre fgets(). Además fflush(stdin) no es la manera correcta de limpiar el buffer de entrada. Esa función solo está definida para limpiar el de salida (fflush(stdout)).

Te dejo una variante que funciona (está probada en Linux):
Código
  1. printf("Introduce el nombre del fichero con las direcciones IP: ");
  2. fgets(file_name, SIZE_NAME, stdin);
  3.        // Eliminar el salto de linea del final y limpiar el buffer de entrada
  4. if(file_name[strlen(file_name)-1] == '\n') file_name[strlen(file_name)-1] = '\0';
  5. else while(getchar() != '\n');
  6.  
  7. file = fopen(file_name, "r");
  8.  
  9. while(fgets(ip, SIZE_IP, file)){
  10. printf("IP address to ping: %s", ip);
  11. strcpy(command, "ping -c 4 ");
  12. strcat(command, ip);
  13. system(command);
  14. }




En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
Vurkolak

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: Ayuda Run-time Failure stack around the variable ping was corrupted
« Respuesta #2 en: 2 Julio 2020, 15:35 pm »

Hola YreX-DwX ante todo muchas gracias por invertir parte de tu tiempo para que los demás también podemos ir aprendiendo, he aplicado la parte de lectura con el código de ejemplo pero antes de llegar allí como bien dices no contempló el fin de cadena de la IP \0 y le añadido uno más para que pueda obtenerlo,  luego si te fijas char ping[] = "ping"; no le pongo cuántos caracteres va a recoger ese array pues luego ese array deberá concatenar con IP con strcat ahora he probado char ping[21] = "ping"; los 5 de ping + los 16 de IP y funciona no sé si es la mejor forma de solucionar el problema pero de esta funciona, rectificame en cualquier cosa lo importante es aprender, gracias
En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Ayuda Run-time Failure stack around the variable ping was corrupted
« Respuesta #3 en: 4 Julio 2020, 20:33 pm »

La solución que busques dependerá un poco de las necesidades de tu programa.

Si por ejemplo, es un programa que estás haciendo para aprender a manejar cadenas o para hacer llamadas al sistema, lo más seguro es que no compense centrar tus esfuerzos en la longitud exacta de las cadenas. Es por esto que normalmente se emplean cadenas char estáticas con tamaños superiores a los necesarios (siempre que la cantidad de memoria no sea un problema).

Si quieres hacerlo con más precisión podrías utilizar memoria dinámica para que cada cadena tenga el largo justo y necesario o utilizar la función strlen() para obtener el largo de una cadena y realizar las cuentas necesarias para calcular de antemano la longitud que necesitas.
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Crear nombres de archivos usando la variable %TIME% y %DATE%
Scripting
arvato 2 4,172 Último mensaje 28 Enero 2009, 06:01 am
por WHK
Ayuda con la Pila (Stack)
ASM
isidora 6 5,776 Último mensaje 3 Diciembre 2011, 03:33 am
por Иōҳ
Implementar Stack Trace (Walk through stack)
ASM
kub0x 5 3,677 Último mensaje 16 Marzo 2014, 19:21 pm
por Arkangel_0x7C5
[Batch] - Sumar valores a la variable %time%
Scripting
gado2612 2 4,104 Último mensaje 4 Julio 2017, 13:46 pm
por gado2612
your device is corrupted and cannot be trusted
Dispositivos Móviles (PDA's, Smartphones, Tablets)
Antoniio 4 2,814 Último mensaje 27 Julio 2018, 19:05 pm
por Machacador
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines