Ayuda Run-time Failure stack around the variable ping was corrupted

Iniciado por Vurkolak, 2 Julio 2020, 01:51 AM

0 Miembros y 1 Visitante están viendo este tema.

Vurkolak

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.

void leerFichero() {
#define SIZE_IP 15
char nombreFichero[256]; //declaramos una array de char para poder introducir la ruta con un máximo de 256 carcateres
char caracter; // declaramos caracter para recoger caracter a caracter
char ip[SIZE_IP]; // declaramos un array de 15 ya que el maximo de una ip es 255.255.255.255
char ping[] = "ping";
//int final = 0;
FILE* miFichero; // declaramos el file como miFichero

printf("Escriba la ruta del fichero a visualizar: \n");

scanf("%s",&nombreFichero); // recogemos la ruta del archivo donde se abrirá
miFichero = fopen(nombreFichero,"r"); //abrimos el fichero en modo lectura "r"
if (miFichero == NULL) { // si el fichero no existe printamos un error
printf("Error al abrir el fichero\n");
}
else
{
printf("\n**************************Lectura del fichero****************************\n\n"); //printamos el contenido del fichero
caracter = fgetc(miFichero); //recoge caracter a caracter y lo almacena en caracter
while (feof(miFichero)==0) // mientras no llegue al final del archivo printará por consola el contenido del fichero
{
printf("%c", caracter);
caracter = fgetc(miFichero);
}
rewind(miFichero);
printf("\n**************************Lectura de las IPs****************************\n\n");

//final=fscanf(miFichero, "%s", ip);

while (!feof(miFichero))
{
fgets(ip, SIZE_IP, miFichero);

//fscanf(miFichero, "%s", ip);
//printf("variable ping: %s variable ip: %s", ping, ip);
strcpy(ping, "ping ");
system(strcat(ping, ip));
}
fclose(miFichero); //cerramos el fichero
}
fflush(stdin); //borramos la memoria
//printf("Presione enter para salir \n");
// getchar();
}


MOD: Corregidas las etiquetas de Código GeSHi

K-YreX

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

printf("Introduce el nombre del fichero con las direcciones IP: ");
fgets(file_name, SIZE_NAME, stdin);
        // Eliminar el salto de linea del final y limpiar el buffer de entrada
if(file_name[strlen(file_name)-1] == '\n') file_name[strlen(file_name)-1] = '\0';
else while(getchar() != '\n');

file = fopen(file_name, "r");

while(fgets(ip, SIZE_IP, file)){
printf("IP address to ping: %s", ip);
getchar();
strcpy(command, "ping -c 4 ");
strcat(command, ip);
system(command);
}



Código (cpp) [Seleccionar]

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

Vurkolak

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

K-YreX

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.
Código (cpp) [Seleccionar]

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