Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] ¿Por que se produce este buffer overflow?

Estas en el tema de ¿Por que se produce este buffer overflow? en el foro de C/C++ en Foros del Web. Muy buenas, estoy empezando a programar asi que soy un poco novatillo en esto, la verdad es que para tener 15 años creo que esta ...
  #1 (permalink)  
Antiguo 01/12/2015, 13:31
Avatar de Pedritogj11  
Fecha de Ingreso: octubre-2015
Ubicación: Murcia
Mensajes: 6
Antigüedad: 8 años, 5 meses
Puntos: 0
Pregunta ¿Por que se produce este buffer overflow?

Muy buenas, estoy empezando a programar asi que soy un poco novatillo en esto, la verdad es que para tener 15 años creo que esta bien lo que conozco sobre programación. Estoy haciendo un pequeño "minijuego" en C y no se porqué se crashea cada vez que elijo un opción en el menú, no consigo encontrar el error :(. Aquí dejo el código. Gracias de antemano.

[URL="https://gyazo.com/7eeb98bd351b772cdb267146b0b7bed6"]https://gyazo.com/7eeb98bd351b772cdb267146b0b7bed6[/URL]

Código:
/* Programa realizado por @PedroGabaldon el xx-xx-xxxx. Consiste en un pequeño juego. Enjoy it! :) */
#include <stdio.h>
#include <conio.h>

int main (void)
{
	char clave = 'P';
	int opcion;
	printf("##############################################\n#                                            #\n#                                            #\n#                                            #\n#              Mini-juego en C               #\n#              Pedrito - 2015                #\n                                             #\n##############################################");
	printf("\n\n________Menu________");
	printf("\n1. Abrir la caja de Pedrito.");
	printf("\n2. Descifrar clave.");
	printf("\n3. Salir.");
	printf("\n\nSeleccione una opcion:");
	scanf("%s", opcion);
	
	switch (opcion)
	{
		case 1: printf("\nEscribe el codigo:");
				scanf("%s, clave");
				if (clave == 'P')
				{
					printf("Enhorabuena, has abierto la caja. :)");
			    }
			    break;	
	}
	printf("Pulse intro para salir:");
	fflush(stdin);
	getchar();
	
	return 0;
}
  #2 (permalink)  
Antiguo 01/12/2015, 13:48
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 5 meses
Puntos: 204
Respuesta: ¿Por que se produce este buffer overflow?

clave únicamente puede almacenar un char... no una cadena de caracteres.

Para almacenar cadenas de caracteres tienes que usar un array:

Código C:
Ver original
  1. char clave[200]; // Cambia 200 por la longitud máxima a almacenar más 1

Por otro lado, el contenido de una cadena de caracteres no se puede comprobar con el operador de igualdad porque es una operación compleja... para eso existe la función strcmp, que podrás encontrar en la librería string.h

Código C:
Ver original
  1. if( strcmp( clave, "P") == 0 ) // 0 representa una igualdad
  2. {
  3. }

Si, en cambio, quieres leer únicamente un caracter, cambia el scanf por este otro:

Código C:
Ver original
  1. scanf("%c",&clave);

%c indica que vas a leer únicamente un carácter.

El & hay que ponerlo porque la función espera un puntero... y clave, declarado tal que char clave; no lo es :)

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #3 (permalink)  
Antiguo 02/12/2015, 11:29
Avatar de Pedritogj11  
Fecha de Ingreso: octubre-2015
Ubicación: Murcia
Mensajes: 6
Antigüedad: 8 años, 5 meses
Puntos: 0
Respuesta: ¿Por que se produce este buffer overflow?

Cita:
Iniciado por eferion Ver Mensaje
clave únicamente puede almacenar un char... no una cadena de caracteres.

Para almacenar cadenas de caracteres tienes que usar un array:

Código C:
Ver original
  1. char clave[200]; // Cambia 200 por la longitud máxima a almacenar más 1

Por otro lado, el contenido de una cadena de caracteres no se puede comprobar con el operador de igualdad porque es una operación compleja... para eso existe la función strcmp, que podrás encontrar en la librería string.h

Código C:
Ver original
  1. if( strcmp( clave, "P") == 0 ) // 0 representa una igualdad
  2. {
  3. }

Si, en cambio, quieres leer únicamente un caracter, cambia el scanf por este otro:

Código C:
Ver original
  1. scanf("%c",&clave);

%c indica que vas a leer únicamente un carácter.

El & hay que ponerlo porque la función espera un puntero... y clave, declarado tal que char clave; no lo es :)

Un saludo.
Vale muchas gracias por la ayuda. Me gustaria que me dijeras porque en el array hay que indicar la longitud maxima MAS 1? Por que uno mas? Y la biblioteca stdio.h, ¿permite la programacion orientada a objetos o es solo para C y no para C++?
Un saludo :)
  #4 (permalink)  
Antiguo 02/12/2015, 15:19
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 5 meses
Puntos: 204
Respuesta: ¿Por que se produce este buffer overflow?

Cita:
Iniciado por Pedritogj11 Ver Mensaje
Me gustaria que me dijeras porque en el array hay que indicar la longitud maxima MAS 1? Por que uno mas?
Porque al que en su momento le tocó decidir cómo gestionar las cadenas de caracteres se le ocurrió que éstas iban a terminar con el caracter nulo '\0'. Luego si quieres almacenar "HOLA" necesitas una variable de, al menos, 5 bytes (4 para la palabra y 1 para el terminador).

Cita:
Iniciado por Pedritogj11 Ver Mensaje
Y la biblioteca stdio.h, ¿permite la programacion orientada a objetos o es solo para C y no para C++?
stdio es una biblioteca con funciones de entrada salida básicas... puedes llamar a dichas funciones desde C y desde C++, ya que ambos lenguajes tienen disponible esta librería. Te daría más detalles, pero es mejor que asientes conocimientos antes de darte más información de la que vas a ser capaz de entender.

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.

Etiquetas: buffer, crash, overflow, programacion
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:10.