Pascal/Turbo Pascal - Eliminar espacios dobles.

   
Vista:

Eliminar espacios dobles.

Publicado por Diego Romero (997 intervenciones) el 03/12/2009 21:12:05
Esto es en respuesta a la cuestión planteada por juan entre otros sobre cómo eliminar espacios sobrantes en una cadena de caracteres (string).

Estás de suerte. Tengo tiempo para trastear un poco. Estaba casi seguro que ya había resuelto este detalle antes pero no encuentro el código así que lo volví a escribir en forma, digamos, sencilla.

function FormatearCadena(S: string):string;
var
i:integer;
result: string;
EsSpc: boolean;
begin
EsSpc:=true;
result:='';

for i:=1 to Length(S) do
begin
if S[i] = ' ' then
begin
if EsSpc = false then
begin
EsSpc:=true;
result:=result+S[i];
end { if }
end { then }
else
begin
EsSpc:=false;
result:=result+S[i];
end; { else }
end; { for }
if result[length(result)] = ' ' then
delete(result,length(result),1); { elimina cualquier espacio al final }
FormatearCadena:=result;
end;

Lo que hace esta función es tomar un string y devolverla sin espacios sobrantes dejando solo uno entre cada palabra y quitando los espacios por delante y por detrás del string.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Eliminar espacios dobles.

Publicado por Antonio (74 intervenciones) el 07/12/2009 17:17:56
Hola, Diego
No pretendo enmendar la plana ni nada que se le parezca. Ante todo no soy
un experto en programacion; solo un aficionado, pero me ha llamado la atencion
que para eliminar los espacios dobles en el interior de un texto haya que emplear
tantas lineas de código, cuando empleando la funcion DELETE podemos reducirlo drasticamente:
for i := 1 to length(cad) do
while (cad[i] = ' ') and (cad[i] = cad[i-1]) do
delete(cad[i],1,1)

writeln(cad).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Eliminar espacios dobles.

Publicado por Diego Romero (997 intervenciones) el 07/12/2009 19:07:07
Antonio: cualquier corrección o mejora es bienvenida, así que no, no está mal "enmendar la plana" :).

Sin embargo tu código adolece de algunos problemas. Primero el más evidente, el primer parámetro de la función delete() debe ser de tipo string, le estás pasando un char. Creo que has querido poner:

delete(cad, 1, 1);

Pero aún así estás borrando siempre el primer caracter y no es eso lo que se quiere obtener. Creo que has querido poner:

delete(cad, i, 1);

Entonces empieza a funcionar. Pero aún hay otro problema. El control del for lo haces con Length(cad) y dentro del for estás cambiando el tamaño de cad. Todo va bien hasta que encuentras un caso como este:

cad:='abc f '; { hay dos espacios después de 'c' }

El tamaño de cad es 7, cuando delete() elimina un espacio el tamaño pasa a ser 6, cuando i llega al final hace la última comparación y vuelve a entrar al while y nunca sale de allí porque está comparando cad[6] con cad[7] que no existe en cad y delete no puede eliminar un caracter que no está en cad. cad[6] y cad[7] son iguales, porque delete() ha desplazado el string a la izquierda, o sea que el espacio en cad[7] sigue estando allí, pero delete() no hace nada porque determina que i está fuera del tamaño dinámico de cad. El resultado es un ciclo infinito. Nunca se sale del while.

Y aún hay otro problemas más. cad[i-1] cuando i = 1 está señalando la posición en el string donde se guarda el tamaño dinámico del array. Supon que cad vale una cadena de caracteres de 32 caracteres de largo y el primer caracter es un espacio que en la tabla ASCII es igual a 32, entonces cad[1] = cad[1-1] es verdadero porque 32 es igual a 32, entonces el delete() procede a borrar el espacio que no está repetido. Sin embargo si la cadena mide distinto de 32 no hace eso.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Eliminar espacios dobles.

Publicado por juan (19 intervenciones) el 08/12/2009 02:32:53
que weno eres diego xD
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Eliminar espacios dobles.

Publicado por Antonio (74 intervenciones) el 09/12/2009 00:09:55
Hola Diego.
Tu respuesta me ha hecho reflexionar sobre el caso y estudiarlo más despacio.

Efectivamente fue un error involuntario lo de Delete(cad,1,1); pues lo correcto es lo que me indicas (cad,i,1).
Otra de las cuestiones es el funcionamiento del BUCLE: Nunca se puede dar la condicion o circunstancia de que cad[i-1] y que "i" sea igual a 1; pues la segunda condición del bucle dice "and(cad[i] = cad[i-1)"; por lo tanto "i" ha de valer como mínimo 2, y esa posición 2 es la que borraría Delete.
Me he visto obligado a implementar el programa en pascal y en ningún caso de los que expones me ha dado error.
Sigo estandote muy agradecido por las ayudas recibidas.
Atentamente

Antonio
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar