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

Corchetes escapeados

Estas en el tema de Corchetes escapeados en el foro de C/C++ en Foros del Web. Buenas tardes-noches: Tengo una duda con este programa en C. Tengo una cadena en la que si viene algún cierracorchete ']' éste ha de venir ...
  #1 (permalink)  
Antiguo 22/06/2010, 13:10
 
Fecha de Ingreso: agosto-2008
Mensajes: 240
Antigüedad: 15 años, 8 meses
Puntos: 6
Corchetes escapeados

Buenas tardes-noches:

Tengo una duda con este programa en C. Tengo una cadena en la que si viene algún cierracorchete ']' éste ha de venir doble. El caso es que tengo que copiarlo a otra cadena sin mostrar los corchetes escapeados. Por ejemplo, si recibo "Hola[3]]" debería mostrar "Hola[3]". En el caso de que venga sólo un cierracorchete, significa que se ha acabado el campo.

He codificado esta función en un fichero a parte para hacer una prueba antes de incorporarlo a un código más extenso en el que conozco la longitud del campo que tengo que copiar. Con ese tamaño he despreciado el cierracorchete que delimita el fin de campo.

He implementado esto por ahora, pero con la cadena de prueba que uso no me funciona del todo bien:

Código C:
Ver original
  1. #include <stdio.h>
  2. #define TAM 23
  3.  
  4. int main()
  5. {
  6.  
  7.   char origen[]="Una de Bichos [2]]]]";
  8.   char destino[TAM];
  9.   int i;
  10.   int tamanio = 0;
  11.  
  12.   // relleno destino de '\0'
  13.  
  14.   for(i=0;i<TAM;i++)
  15.     destino[i]='\0';
  16.  
  17.  
  18.  
  19.   for(i=0; i < TAM; i++)
  20.     {
  21.       if(origen[i] == ']')
  22.     {
  23.       if(origen[i+1] == ']') // si viene dos ']' seguidos, guardo uno y el segundo lo obvio
  24.         {
  25.           destino[i] = origen[i];
  26.           i++; // me salto el segundo corchete
  27.         }    
  28.     }
  29.       else // si no viene un ']' guardo lo que venga (serán otros caracteres)
  30.     {
  31.       destino[i] = origen[i];
  32.     }
  33.     }
  34.  
  35.   printf("Campo origen: %s Campo destino: %s\n", origen, destino);
  36.  
  37.   return 0;
  38. }

Al final de la ejecución, destino debería contener la cadena "Una de Bichos [2]]"


Espero que alguien pueda ayudarme, porque no se me ocurre nada más.
Gracias de antemano,
gonzo
  #2 (permalink)  
Antiguo 23/06/2010, 06:07
 
Fecha de Ingreso: septiembre-2008
Mensajes: 67
Antigüedad: 15 años, 7 meses
Puntos: 3
Respuesta: Corchetes escapeados

Lo primero decirte que no deberias rellenar la cadena destino de \0 porque eso es el final de cadena y luego al imprimirlo te puede dar problemas si por ejemplo tiene sesto:
"Una de bichos[2]\0]" o algo asi

Rellenalo con espacios en blanco por ejemplo ' '

y el final si debe ser \0
  #3 (permalink)  
Antiguo 23/06/2010, 09:05
 
Fecha de Ingreso: enero-2008
Mensajes: 229
Antigüedad: 16 años, 3 meses
Puntos: 1
Respuesta: Corchetes escapeados

Ademas debes utilizar un contador diferente del de utilizas para recorrer origen. ya que la posicion en que vas colocar un caracter en destino despues de saltarte un corchete ya no va a ser igual a la posicion del caracter en origen.

Última edición por margarito04; 23/06/2010 a las 09:40
  #4 (permalink)  
Antiguo 23/06/2010, 10:07
 
Fecha de Ingreso: agosto-2008
Mensajes: 240
Antigüedad: 15 años, 8 meses
Puntos: 6
Respuesta: Corchetes escapeados

Hola:

Lo primero daros las gracias a ambos por vuestros consejos. He seguido la recomendación de margarito04, usar otro índice, a parte de que he cambiado por completo el código y ahora uso una variable que me almacena el elemento anterior.
Me refiero a algo así:
Código C:
Ver original
  1. void copiaCampo ( char * destino, char * origen, int tamanio )
  2. {
  3.   int i;
  4.   int j = 0;
  5.   char anterior = 0;
  6.  
  7.   for ( i = 0; i < tamanio; i++ )
  8.     {
  9.       if ( ( origen[i] != ']' ) || ( anterior != ']' ) )
  10.         {
  11.           destino[j] = origen[i];
  12.           j++;
  13.           anterior = origen[i];
  14.         }
  15.       else
  16.         {
  17.           anterior = 0; // para volver a contar con la siguiente pareja de corchetes
  18.         }
  19.     }
  20.  
  21.   destino[i]='\0';
  22. }

Gracias por todo,
gonzo

Etiquetas: Ninguno
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 03:00.