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

Saturación de buffer al cargar String

Estas en el tema de Saturación de buffer al cargar String en el foro de C/C++ en Foros del Web. Buenos días a todos. Como recién llegado todavía no os conozco, así que espero no ser muy cabezón. El problema que tengo es este: al ...
  #1 (permalink)  
Antiguo 03/07/2015, 01:41
 
Fecha de Ingreso: julio-2015
Mensajes: 6
Antigüedad: 8 años, 9 meses
Puntos: 0
Saturación de buffer al cargar String

Buenos días a todos. Como recién llegado todavía no os conozco, así que espero no ser muy cabezón.

El problema que tengo es este: al cargar un string, si pasa de la longitud de la cadena, ésta se corrompe y el programa da error.
Una solución es usar scanf("%20c",cadena), que toma sólo los 20 primeros caracteres. Pero ésta daja de leer en cuanto llega al primer espacio.
Otra podría ser scanf("%[^\n]s",&cadena), que coge hasta el primer retorno de carro (bueno, a mí me gusta para en un ESCAPE) pero esta opción no controla si te pasas con los caracteres.
Ya sólo me queda hacer una cadena gigante y copiar de ésta a la cadena de trabajo, o usar aritmética de punteros pura y dura.

¿Alguna idea? Gracias a todos, y si he sido muy pesado, es mi primera entrada.
  #2 (permalink)  
Antiguo 03/07/2015, 02:30
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Saturación de buffer al cargar String

C no se caracteriza precisamente por ofrecer una interfaz potente para interactuar con la consola o con la entrada estándar.

Una opción que tienes es usar un buffer temporal lo suficientemente grande como para admitir prácticamente cualquier cadena. Vuelcas la entrada a dicho buffer y después ya trabajas sobre el mismo para saber su longitud y cualqueir otra cosa que necesites:

Código C:
Ver original
  1. char buffer[2000];
  2. scanf( "%s", buffer );
  3.  
  4. // opcion 1: copiar si la longitud es correcta y error en caso contrario
  5. if( strlen( buffer ) < 20 )
  6.   strcpy( cadena, buffer );
  7. else
  8.   MostrarError( "Longitud no valida" );
  9.  
  10. // opcion 2: reservar la memoria necesaria para copiar la cadena
  11. cadena = malloc( strlen( buffer ) );
  12. strcpy( cadena, buffer );

Y si no siempre te queda pasarte a C++, la clase string ya se encarga de todos estos problemas sin que tu tengas que pensar en ello.

Un saludo
  #3 (permalink)  
Antiguo 03/07/2015, 03:28
 
Fecha de Ingreso: julio-2015
Mensajes: 6
Antigüedad: 8 años, 9 meses
Puntos: 0
Respuesta: Saturación de buffer al cargar String

Gracias por la respuesta. Usaré de momento lo del buffer, y luego iré a C++

Etiquetas: buffer, programa, string
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:50.