Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Xedrox en 5 Agosto 2013, 19:25 pm



Título: Capturar excepcion
Publicado por: Xedrox en 5 Agosto 2013, 19:25 pm
Buenas gente, tengo la siguiente funcion que guarda una subcadena en otra. El problema es que cuando la pifio con los indices el program genera un dump. No puedo usar strlen ni el caracter nulo para extrer la subcadena, porque la cadena original esta llena de nulos intermedios que tengo que conservar, asi que simplemente hago:

Código:
void subString(char *src,char *dest,int posInicial,int longitud)
{
for(int i=0;i<longitud;i++)
{
dest[i]=src[posInicial+i];
}
}

Como captura la excepcion que se genere cuando hago una referencia a un indice que no existe?

Muchas Gracias
Saludos


Título: Re: Capturar excepcion
Publicado por: amchacon en 5 Agosto 2013, 22:40 pm
Código
  1. Como captura la excepcion que se genere cuando hago una referencia a un indice que no existe?
C no comprueba los índices de los arrays, de modo que no puede saber si estás accediendo a una zona protegida o no (esto se hizo para ganar rendimiento, confiando en que el programador fuese lo bastante espabilado como para no acceder a posiciones fuera del array). Lo ideal esque te pasen el tamanyo de la segunda cadena y devuelvas un error si posInicial+Longitud > Tamanyo.

¿Estás en C o C++? El segundo tiene una clase string con muchas de estas cosas hechas:
http://www.cplusplus.com/reference/string/string/
http://www.cplusplus.com/reference/string/string/assign/
http://www.cplusplus.com/reference/string/string/substr/


Título: Re: Capturar excepcion
Publicado por: BlackZeroX en 6 Agosto 2013, 01:31 am
En lugar de esa función mejor...

Código
  1. const char src[] = "HolaMundo";
  2.      char dst[10] = {};
  3.    memcpy(dst, &src[3], 5); // El parametro posInicial no es necesario lo puedes calcular por fuera... en este caso es el indice 3
  4.    puts(src);
  5.    puts(dst);
  6.  

La excepción la puedes capturar con un if() pero debes tener guardada la longitud de el bloque de memoria reservado.

Dulces Lunas!¡.