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

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [C] Segmentation Fault - Fallo manejo de cadenas
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [C] Segmentation Fault - Fallo manejo de cadenas  (Leído 3,094 veces)
Miky Gonzalez

Desconectado Desconectado

Mensajes: 87

http://mikygonzalez.comule.com/blog/


Ver Perfil WWW
[C] Segmentation Fault - Fallo manejo de cadenas
« en: 20 Marzo 2013, 20:19 pm »

Voy a ir directo: tengo una función en C que me provoca un fallo de segmentación. He revisado y creo que los punteros están bien colocados y no devería de acceder a recursos de memoria no-accesibles.
Código
  1. void eliminar_espacios(char *contenido_linea) {
  2. char *cadena_temporal = (char *)malloc(255);
  3.  
  4. while(*contenido_linea) {
  5. if((*contenido_linea != 32) && (*contenido_linea != '\t')) {
  6. contenido_linea++;
  7. } else {
  8. *cadena_temporal = *contenido_linea;
  9. cadena_temporal++;
  10. }
  11. }
  12.  
  13. return (void)contenido_linea;
  14. }
  15.  

Elimina los espacios de una cadena.

Saludos!


« Última modificación: 20 Marzo 2013, 20:30 pm por Miky Gonzalez » En línea

Mi blog personal, con información acerca de programación, seguridad, desarrollo y electrónica:


EN CONSTRUCCIÓN
amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: [C] Segmentation Fault - Fallo manejo de cadenas
« Respuesta #1 en: 20 Marzo 2013, 21:10 pm »

El fallo está en la condición del while:

Código
  1. while(*contenido_linea)
Esa condición siempre va a ser cierta, incluso aunque se sobrepase la cadena (no tienes garantía que haya un NULL al final!).

Está es la alternativa que te propongo:

Código
  1. # include <stdio.h>
  2. # include <stdlib.h>
  3. # include <string.h>
  4.  
  5. int main()
  6. {
  7.    char* contenido_linea = "Cosita linda y hermosa";
  8.    char* cadena_temporal = (char *)malloc(255);
  9.    int tamanyo = strlen(contenido_linea);
  10.    int i = 0;
  11.    int posicion = 0;
  12.  
  13. for (i = 0; i < tamanyo;i++)
  14. {
  15. if((contenido_linea[i] != 32) && (contenido_linea[i] != '\t')) {
  16. cadena_temporal[posicion] = contenido_linea[i];
  17. posicion++;
  18. }
  19. }
  20.    cadena_temporal[posicion] = '\0'; // Añadimos el caracter nulo al final
  21.    printf("%s",cadena_temporal);
  22.    return 0;
  23. }
  24.  


« Última modificación: 20 Marzo 2013, 21:14 pm por amchacon » En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: [C] Segmentation Fault - Fallo manejo de cadenas
« Respuesta #2 en: 20 Marzo 2013, 21:46 pm »

El fallo está en la condición del while:

Código
  1. while(*contenido_linea)
Esa condición siempre va a ser cierta, incluso aunque se sobrepase la cadena (no tienes garantía que haya un NULL al final!).

Está es la alternativa que te propongo:

Código
  1. # include <stdio.h>
  2. # include <stdlib.h>
  3. # include <string.h>
  4.  
  5. int main()
  6. {
  7.    char* contenido_linea = "Cosita linda y hermosa";
  8.    char* cadena_temporal = (char *)malloc(255);
  9.    int tamanyo = strlen(contenido_linea);
  10.    int i = 0;
  11.    int posicion = 0;
  12.  
  13. for (i = 0; i < tamanyo;i++)
  14. {
  15. if((contenido_linea[i] != 32) && (contenido_linea[i] != '\t')) {
  16. cadena_temporal[posicion] = contenido_linea[i];
  17. posicion++;
  18. }
  19. }
  20.    cadena_temporal[posicion] = '\0'; // Añadimos el caracter nulo al final
  21.    printf("%s",cadena_temporal);
  22.    return 0;
  23. }
  24.  

Que quieres decir que la condición while es incorrecta?
Igual si se le pasa a strlen una secuencia de bytes sin ninguna garantización que haya un null, también fallaria.
o algun valor incorrecto, lo mejor seria depurar el codigo. Por cierto, si yo pasara una cadena con una longitud de 1000 con ningun espacio y el buffer
reservado es de 255 bytes?


mi version:

Código
  1.  
  2. PCHAR StrRemoveSpace(PCHAR lpStr)
  3. {
  4.    PCHAR lpStrRet;
  5.    PCHAR lpStrIndx;
  6.    SIZE_T MaxSizeOfStr;
  7.  
  8.  
  9.    if(!lpStr)
  10.        return FALSE;
  11.  
  12.    MaxSizeOfStr = strlen(lpStr);
  13.    if(!(MaxSizeOfStr > 0))
  14.        return FALSE;
  15.  
  16.    lpStrRet = lpStrIndx = (PCHAR) malloc(MaxSizeOfStr);
  17.    if(!lpStrRet)
  18.        return FALSE;
  19.  
  20.    for(INT x = 0; x < MaxSizeOfStr+1; x++)
  21.    {  
  22.        if(lpStr[x] != 32)
  23.            *lpStrIndx++ = lpStr[x];
  24.  
  25.    }
  26.    return lpStrRet;
  27. }
  28.  
  29.  

Comprueba cualquier tipo de valor incorrecto o no esperado, y para más seguridad podrias agregar un controlador de excepcion, debido a que podria aún darse una.

« Última modificación: 20 Marzo 2013, 21:47 pm por x64Core » En línea

Khronos14


Desconectado Desconectado

Mensajes: 443


A lie is a lie


Ver Perfil WWW
Re: [C] Segmentation Fault - Fallo manejo de cadenas
« Respuesta #3 en: 20 Marzo 2013, 22:15 pm »

amchacon, el bucle está perfecto. Lo que hace es comprobar que el carácter actual es distinto de 0, que es el terminador de cadena.

Yo creo que el problema puede estar en que para cadena_temporal reservas 255 bytes y si contenido_linea tiene más caracteres = Segmentation Fault.


Código
  1. void eliminar_espacios(char *contenido_linea) {
  2. char *cadena_temporal = (char *)malloc(strlen(contenido_linea) + 1);
  3.  
  4. while(*contenido_linea) {
  5. if((*contenido_linea != 32) && (*contenido_linea != '\t')) {
  6. contenido_linea++;
  7. } else {
  8. *cadena_temporal = *contenido_linea;
  9. *(++cadena_temporal) = '\0';
  10. }
  11. }
  12.  
  13. return (void)contenido_linea;
  14. }


Saludos.
En línea

x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: [C] Segmentation Fault - Fallo manejo de cadenas
« Respuesta #4 en: 20 Marzo 2013, 22:46 pm »

amchacon, el bucle está perfecto. Lo que hace es comprobar que el carácter actual es distinto de 0, que es el terminador de cadena.

Yo creo que el problema puede estar en que para cadena_temporal reservas 255 bytes y si contenido_linea tiene más caracteres = Segmentation Fault.


Código
  1. void eliminar_espacios(char *contenido_linea) {
  2. char *cadena_temporal = (char *)malloc(strlen(contenido_linea) + 1);
  3.  
  4. while(*contenido_linea) {
  5. if((*contenido_linea != 32) && (*contenido_linea != '\t')) {
  6. contenido_linea++;
  7. } else {
  8. *cadena_temporal = *contenido_linea;
  9. *(++cadena_temporal) = '\0';
  10. }
  11. }
  12.  
  13. return (void)contenido_linea;
  14. }


Saludos.

???

-

Por cierto, alguien me puede explicar que es esto:

Código:
void eliminar_espacios(char *contenido_linea) {
...
return (void)contenido_linea;


En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: [C] Segmentation Fault - Fallo manejo de cadenas
« Respuesta #5 en: 20 Marzo 2013, 23:09 pm »

amchacon, el bucle está perfecto. Lo que hace es comprobar que el carácter actual es distinto de 0, que es el terminador de cadena.

Yo creo que el problema puede estar en que para cadena_temporal reservas 255 bytes y si contenido_linea tiene más caracteres = Segmentation Fault.


Código
  1. void eliminar_espacios(char *contenido_linea) {
  2. char *cadena_temporal = (char *)malloc(strlen(contenido_linea) + 1);
  3.  
  4. while(*contenido_linea) {
  5. if((*contenido_linea != 32) && (*contenido_linea != '\t')) {
  6. contenido_linea++;
  7. } else {
  8. *cadena_temporal = *contenido_linea;
  9. *(++cadena_temporal) = '\0';
  10. }
  11. }
  12.  
  13. return (void)contenido_linea;
  14. }


Saludos.
Estas añadiendo caracteres nulos en cada iteración? Oo

Solo tienes que añadirselo al final.

Por cierto, alguien me puede explicar que es esto:

Código:
void eliminar_espacios(char *contenido_linea) {
...
return (void)contenido_linea;



Pues es una buena pregunta, al pasar un cast como void nos quedaría algo así:

Código:
void eliminar_espacios(char *contenido_linea) {
...
return;

Es decir, no devuelves nada.
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: [C] Segmentation Fault - Fallo manejo de cadenas
« Respuesta #6 en: 20 Marzo 2013, 23:20 pm »


Pues es una buena pregunta, al pasar un cast como void nos quedaría algo así:

Código:
void eliminar_espacios(char *contenido_linea) {
...
return;

Es decir, no devuelves nada.

Seguro, yo realmente no entiendo lo que querian ellos hacer.

-

Por cierto, El codigo de Khronos14 genera una excepción.

En línea

durasno


Desconectado Desconectado

Mensajes: 373


Ver Perfil
Re: [C] Segmentation Fault - Fallo manejo de cadenas
« Respuesta #7 en: 21 Marzo 2013, 01:03 am »

Citar
Elimina los espacios de una cadena.
No, lo unico q hace es copiar los espacios en cadena temporal...


El problema de fallo de segmentación se debe a que estas generando un "bucle infinito".
Supongamos que tenemos la cadena "Hola mundo", usando tu funcion la condicion del if va a hacer verdadera hasta que contenido_linea apunte al espacio. Una vez que apunte al espacio se ejecuta el else, pero que sucede en el ciclo siguiente y en los posteriores??? contenido_linea va a seguir apuntando al espacio ya que no lo incrementas fuera del if, entonces solo se ejecuta el else y la condicion del while siempre es verdadero. Al entrar solo al else se incrementa permanentemente el puntero cadena_temporal provocando el "fallo de segmentación"


Espero se haya entendido. Saludos
En línea

Ahorrate una pregunta, lee el man
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Segmentation fault (core dumped)
Programación C/C++
neveldine 3 5,614 Último mensaje 3 Mayo 2012, 17:03 pm
por neveldine
Manejo de cadenas en C++ [Programación básica]
Programación C/C++
sombrakepsilon 0 1,457 Último mensaje 2 Diciembre 2015, 20:36 pm
por sombrakepsilon
[C] Manejo de cadenas
Programación C/C++
n-utz 2 2,273 Último mensaje 19 Octubre 2016, 09:14 am
por class_OpenGL
Fallo en Manejo de Ventanas
GNU/Linux
SDCC 4 2,624 Último mensaje 28 Enero 2020, 03:02 am
por SDCC
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines