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

Eliminar sucbadena de una cadeba

Estas en el tema de Eliminar sucbadena de una cadeba en el foro de C/C++ en Foros del Web. Hola! Pues si, ese es un pequeño problema que tengo que resolver y no lo consigo. Sé que hay bastantes funciones de manejo de cadenas ...
  #1 (permalink)  
Antiguo 29/03/2009, 05:54
 
Fecha de Ingreso: octubre-2008
Mensajes: 43
Antigüedad: 15 años, 6 meses
Puntos: 0
Eliminar sucbadena de una cadeba

Hola!

Pues si, ese es un pequeño problema que tengo que resolver y no lo consigo. Sé que hay bastantes funciones de manejo de cadenas en C, pero ninguna que haga eso.

Lo único que se me ocurrió es: usar la función strstr(char * original, char * subcadena) que devuelve un puntero a donde empieza la cadena subcadena dentro de la original. Con esto podría restar "original-resultado_función" y así saber cuantos caracteres hay hasta que empieza, y a partir de ahí ya con un algoritmo facilito eliminarlos, o pasarlas de una cadena a otra. El problema que me encuentro al hacer esto es que me da Fallo de segmentación (cuando hago las operaciones de asignación sobre el char *).

Así pues, alguien sabe como resolver este problema de una forma que funcione, o si hay alguna funcion de manejo de cadenas que lo haga

Muchas gracias!
  #2 (permalink)  
Antiguo 29/03/2009, 08:36
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 19 años, 11 meses
Puntos: 74
Respuesta: Eliminar sucbadena de una cadeba

El problema esta en tu codigo especifico, seguramente estes accediendo a memoria invalida (o para la cual no tenes permiso de escritura). La logica parece estar bien encaminada; buscas el comienzo de la subcadena y (cuando no devuelve NULL strstr) escribis desde ese punto X (el tamaño de la subcadena) caracteres de espacio por ejemplo (si usas 0 y la subcadena esta por la mitad de la cadena la vas a terminar ahi y vas a perder lo que siga).
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #3 (permalink)  
Antiguo 29/03/2009, 13:31
 
Fecha de Ingreso: octubre-2008
Mensajes: 43
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: Eliminar sucbadena de una cadeba

La logica es la siguiente:

Código:
#include <stdio.h>
#include <string.h>

main()
{
	char *subca;
	int x;
	char * prueba;
	prueba="olamanola";

	char * cad_buscar;
	cad_buscar="man";

	subca=strstr(prueba,cad_buscar);
			if (subca) {
					x=subca-prueba;
					int offset;
					offset=x;
					x=strlen(prueba);
					int i; i=0;
					char  * copia;
                                        copia="";
					while (i<offset){ printf("%c",prueba[i]); copia[i]=prueba[i];i++; }
					int j;
                                        j=i;
					i=offset+strlen("man");
					while (i<strlen(prueba)){ printf("%c",prueba[i]); copia[j]=prueba[i];i++;}
					printf("\n");
					printf("%s\n",copia);

				}else printf("No hay esa subcadena");


}
La idea de ahora es, recorrer con los dos while las 2 partes de la cadena "prueba" (la que me interesa). Los bucles están bien, si quitais las instrucciones de asignación y dejais los printf y el incremento de i, vereis que lo visualiza bien. El problema es cuando intento copiar, por alguna razón, me da un fallo de segmentación que me trae loco.
  #4 (permalink)  
Antiguo 29/03/2009, 13:52
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 19 años, 11 meses
Puntos: 74
Respuesta: Eliminar sucbadena de una cadeba

No lo mire pero a simple vista:
char * copia;
copia="";
while (i<offset){ printf("%c",prueba[i]); copia[i]=prueba[i];i++; }

Copia apunta a una direccion indefinida, seguramente invalida, despues a una cadena vacia y despues estas escribiendo sobre la cadena vacia ...
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #5 (permalink)  
Antiguo 29/03/2009, 14:42
 
Fecha de Ingreso: octubre-2008
Mensajes: 43
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: Eliminar sucbadena de una cadeba

Cita:
Iniciado por Eternal Idol Ver Mensaje
No lo mire pero a simple vista:
char * copia;
copia="";
while (i<offset){ printf("%c",prueba[i]); copia[i]=prueba[i];i++; }

Copia apunta a una direccion indefinida, seguramente invalida, despues a una cadena vacia y despues estas escribiendo sobre la cadena vacia ...
Gracias, ya me imaginaba que el Fallo de segmentación, y por eso la inicializé a la cadena vacía, para ver si así le ponia un puntero a una dirección y poder usar ese espacio, pero nada.

Y como resuelvo esto?
  #6 (permalink)  
Antiguo 29/03/2009, 15:48
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 19 años, 11 meses
Puntos: 74
Respuesta: Eliminar sucbadena de una cadeba

Podes reservar memoria dinamica:
char *copia = new char[strlen(prueba)];

al finalizar su uso liberala:
delete[] copia;

PD. Los bucles parecen estar mal aunque no los mire atentamente, depura el programa.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO

Última edición por Eternal Idol; 30/03/2009 a las 02:17
  #7 (permalink)  
Antiguo 30/03/2009, 01:54
 
Fecha de Ingreso: octubre-2008
Mensajes: 43
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: Eliminar sucbadena de una cadeba

Cita:
Iniciado por Eternal Idol Ver Mensaje
Podes reservar memoria dinamica:
char copia = new char[strlen(prueba)];

al finalizar su uso liberala:
delete[] copia;
Gracias, probaré esto.

Cita:
Iniciado por Eternal Idol Ver Mensaje
PD. Los bucles parecen estar mal aunque no los mire atentamente, depura el programa.
Pues miralos atentamente porque a mi me funcionan bien.
  #8 (permalink)  
Antiguo 30/03/2009, 02:24
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 19 años, 11 meses
Puntos: 74
Respuesta: Eliminar sucbadena de una cadeba

Los mire atentamente (tuve que hacer el esfuerzo de leer esos bucles while en una sola linea ademas de todas las variables) y efectivamente no funcionan bien, j no se incrementa en el segundo bucle y si lo hubieras depurado como te dije lo hubieras notado. Esta es la razon por la cual no va a funcionar correctamente el codigo incluso usando memoria dinamica (ademas de no tener cero terminador la cadena, aunque esto se soluciona facilmente con un ZeroMemory/memset).
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #9 (permalink)  
Antiguo 30/03/2009, 07:45
 
Fecha de Ingreso: octubre-2008
Mensajes: 43
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: Eliminar sucbadena de una cadeba

Cita:
Iniciado por Eternal Idol Ver Mensaje
Los mire atentamente (tuve que hacer el esfuerzo de leer esos bucles while en una sola linea ademas de todas las variables) y efectivamente no funcionan bien, j no se incrementa en el segundo bucle y si lo hubieras depurado como te dije lo hubieras notado. Esta es la razon por la cual no va a funcionar correctamente el codigo incluso usando memoria dinamica (ademas de no tener cero terminador la cadena, aunque esto se soluciona facilmente con un ZeroMemory/memset).
Lo solucioné con memoria dinámica (y ya me di cuenta que no incrementaba i).

Los bucles while están en una linea porque para hacer una prueba, escribiendo en el portátil y con el editor de textos de linux me era más cómodo así.
  #10 (permalink)  
Antiguo 30/03/2009, 08:02
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 19 años, 11 meses
Puntos: 74
Respuesta: Eliminar sucbadena de una cadeba

Bien, j era la variable que no incrementabas. Tanto para leer como para depurar (poner un breakpoint en la linea entera vs poner un breakpoint en cada sentencia) es mucho mejor hacer un bucle (siempre es mas legible un for) con cada sentencia en una linea.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
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 13:38.