Ir al contenido


Foto

[RESUELTO] Como eliminar espacios en el centro de una cadena?


  • Por favor identifícate para responder
21 respuestas en este tema

#1 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 775 mensajes
  • LocationPinar del Río, Cuba

Escrito 10 junio 2010 - 12:27

Hola a todos
Necesito hacer una funcion que me permita eliminar los espacios en blanco sobrantes en una cadena, pero los que se encuentran en el interior de la cadena, no al principio y al final, que se puede hacer con Trim

Pero tampoco me sirve con StringReplace, que me sustituiria todos los espacios existentes

Pues lo que quiero es que cuando haya mas de un espacio blanco, me deje solamente uno

Ejemplo:

Esto: 'algo de      la    cadena'

Lo convierta en esto: 'algo de la cadena'

espero haberme explicado







  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 10 junio 2010 - 12:47

Que tal JoAnCa, algo rápido



delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3.   cadena: string;
  4. begin
  5.   cadena :=  'algo de      la    cadena';
  6.   repeat
  7.     cadena := StringReplace(cadena,'  ',' ',[rfReplaceAll]);
  8.   until pos('  ',cadena) = 0 ;
  9.   ShowMessage(Cadena);
  10. end;



Pero seguro habrá quien lo haga mas fácil :)

Salud OS
  • 0

#3 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 10 junio 2010 - 12:54

Saludos.

Puedes combinar las funciones Pos y Copy.
  • 0

#4 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 10 junio 2010 - 02:02

Asi de repente, se me ocurre esto:


delphi
  1. var
  2.   i: Integer;
  3.   Str: String;
  4. begin
  5.   Str:= 'Cualquier  cosa';
  6.   i:= pos(#32#32,Str);
  7.   while  i > 0 do
  8.   begin
  9.     delete(Str,i,1);
  10.     i:= pos(#32#32,Str);
  11.   end;
  12.   ShowMessage(Str);
  13. end;



:undecided: Pero se me hace muy parecido a lo de egostar
  • 0

#5 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 10 junio 2010 - 02:05

Yo haría un simple recorrido de la cadena.



delphi
  1. function EliminarEspacios(Cadena: string): string;
  2. var i: integer
  3. begin
  4.   Result := '';
  5.   for i := 1 to Length(Cadena) do begin
  6.     if Cadena[i] <> ' ' then Result := Result + Cadena[i];
  7.   end;
  8. end;


  • 0

#6 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 10 junio 2010 - 02:07

Esto ya es otra cosa:


delphi
  1. var
  2.   i: Integer;
  3.   Str: String;
  4. begin
  5.   Str:= 'Cualquier  co            sa';
  6.   for i:= Length(str) downto 1 do
  7.     if Copy(Str,i,2) = #32#32 then
  8.       delete(Str,i,1);
  9.   ShowMessage(Str);
  10. end;


  • 1

#7 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 10 junio 2010 - 02:32



delphi
  1. LsVar := AnsiReplaceStr(Texto,' ','');



Edito: :p por no leer todo el problema he posteado una solución que no aplica :p
  • 0

#8 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 775 mensajes
  • LocationPinar del Río, Cuba

Escrito 10 junio 2010 - 02:53

Con esta solucion y las parecidas



delphi
  1. cadena := StringReplace(cadena,'  ',' ',[rfReplaceAll]);



no funciona cuando hay mas de dos espacios, si hay 5 espacios me deja 3, y asi sucesivamente

Ya encontre la solución con esta funcion que me dio maeyanes de CD



delphi
  1. function RemoveBlanks(const Str: string): string;
  2. var
  3.   I: Integer;
  4.   FirstBlank: Boolean;
  5.  
  6. begin
  7.   Result := '';
  8.   for I := 1 to Length(Str) do
  9.   begin
  10.     if Str[i] <> ' ' then
  11.     begin
  12.       Result := Result + Str[i];
  13.       FirstBlank := True;
  14.     end
  15.     else
  16.       if FirstBlank then
  17.       begin
  18.         FirstBlank := False;
  19.         Result := Result + Str[i]
  20.       end
  21.   end
  22. end;


  • 0

#9 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 10 junio 2010 - 03:04

Seguro amigo ?... según yo ese detalle se soluciona con el bucle que implementó Egostar  ^o|... al menos fué el que yo probé y por más espacios que colocaba me los quitaba y dejaba uno entre cada palabra...

En fin... que bien que ya lo hayas solucionado...

Saludox ! :)
  • 0

#10 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 10 junio 2010 - 03:07

Seguro amigo ?... según yo ese detalle se soluciona con el bucle que implementó Egostar  ^o|... al menos fué el que yo probé y por más espacios que colocaba me los quitaba y dejaba uno entre cada palabra...

En fin... que bien que ya lo hayas solucionado...

Saludox ! :)


Ahhhhh, dudaste que mi solución fuera correcta :( :p :D :D :D

Nada nada, la mejor solución es la que te acomoda y no te confunde :D :D :D

Salud OS
  • 0

#11 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 10 junio 2010 - 03:39

:p :p :p La mía también funciona, y son solo tres lineas  :D

Esto ya es otra cosa:


delphi
  1. var
  2.   i: Integer;
  3.   Str: String;
  4. begin
  5.   Str:= 'Cualquier  co            sa';
  6.   for i:= Length(str) downto 1 do
  7.     if Copy(Str,i,2) = #32#32 then
  8.       delete(Str,i,1);
  9.   ShowMessage(Str);
  10. end;



  • 0

#12 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 10 junio 2010 - 04:10

:p :p :p La mía también funciona, y son solo tres lineas  :D


Esto ya es otra cosa:


delphi
  1. var
  2.   i: Integer;
  3.   Str: String;
  4. begin
  5.   Str:= 'Cualquier  co            sa';
  6.   for i:= Length(str) downto 1 do
  7.     if Copy(Str,i,2) = #32#32 then
  8.       delete(Str,i,1);
  9.   ShowMessage(Str);
  10. end;



Es verdad amigo... funciona de perlas (y).... sólo que la palabra separada (co        sa) no la "junta" correctamente, pero suponiendo que el problema no es dentro de la palabra si no entre una y otra, tienes razón.... funciona y funciona muy bien...

Saludox ! :)
  • 0

#13 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 10 junio 2010 - 04:21

Apoyo la moción con un poco de C:



cpp
  1. void BorraMultiespacios(char *Cadena)
  2. {
  3.   char *D = Cadena;
  4.   for(char *S=D; *S;)
  5.     *S == ' ' && *(S+1) == ' ' ? *S++: *D++ = *S++;
  6.   *D = 0;
  7. }

Su uso:

cpp
  1. char Cadena[] = "Hola  que    tal";
  2. BorraMultiespacios(Cadena);

Saludos.
  • 0

#14 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 10 junio 2010 - 04:48

Apoyo la moción con un poco de C:


:p :p :p Usando punteros lo hace cualquiera  :D :D :D ¿quien se anima con asm?
  • 0

#15 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 10 junio 2010 - 04:55


Apoyo la moción con un poco de C:


:p :p :p Usando punteros lo hace cualquiera  :D :D :D ¿quien se anima con asm?




asm
  1. ; Ya comencé yo... síganle 



(y)  :D

Saludox ! :)
  • 0

#16 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 10 junio 2010 - 07:25




asm
  1. ; Ya comencé yo... síganle 



(y)  :D

Saludox ! :)





asm
  1. ; Ya comencé yo... síganle
  2.  
  3. ; Yo le sigo ;)
  4.  
  5. .model small
  6. .stack
  7. .data
  8. Cadena DB 'Hola  que    tal$'
  9. .code
  10.  
  11. ReplaceStr:
  12.     mov ax, @data
  13.     mov ds, ax
  14.     mov dx, offset Cadena
  15. end ReplaceStr



Salud OS
  • 0

#17 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 11 junio 2010 - 06:55

:p :p :p Usando punteros lo hace cualquiera  :D :D :D


Con punteros en delphi:

delphi
  1. procedure BorraMultiespacios(Cadena: PCHAR);
  2. var
  3.   D, S: PCHAR;
  4. begin
  5.   D:= Cadena;
  6.   S:= D;
  7.   while S^<>#0 do
  8.   begin
  9.     if(S^ = #32) and ((S+1)^ = #32) then inc(S)
  10.     else begin
  11.         D^:= S^;
  12.         inc(D); inc(S);
  13.     end;
  14.   end;
  15.   D^:= #0;
  16. end;

¿quien se anima con asm?


En asm:

cpp
  1. void _BorraMultiespacios(char *Cadena)
  2. {
  3.   __asm{
  4. mov      edi, Cadena
  5. mov      esi, edi
  6. @loop1:
  7. cmp      word ptr [esi], 2020h
  8. jne      short @sigue
  9. inc      esi
  10. jmp @loop1
  11. @sigue:
  12. movsb
  13. cmp      byte ptr [esi], 0
  14. jne      short @loop1
  15. mov      word ptr [edi], 0h
  16.   }
  17. }

Saludos.
  • 0

#18 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 11 junio 2010 - 07:16

Jajaja, no se puede bromear con escafandra  :D
  • 0

#19 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 775 mensajes
  • LocationPinar del Río, Cuba

Escrito 11 junio 2010 - 07:18


Seguro amigo ?... según yo ese detalle se soluciona con el bucle que implementó Egostar  ^o|... al menos fué el que yo probé y por más espacios que colocaba me los quitaba y dejaba uno entre cada palabra...

En fin... que bien que ya lo hayas solucionado...

Saludox ! :)


Ahhhhh, dudaste que mi solución fuera correcta :( :p :D :D :D

Nada nada, la mejor solución es la que te acomoda y no te confunde :D :D :D

Salud OS


Bueno en realidad no probé esa solucion  :embarrassed:

se me habia parecido a la otra, y no la probe solo la analice a la ligera

Disculpame egostar  :( por no tener en cuenta tu solucion, es que como habia encontrado otra, no segui analizando otras respuestas

Pero ya veo que se animaron y han dado mas soluciones de la cuenta  :D :D
  • 0

#20 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 11 junio 2010 - 07:31

Jajaja, no se puede bromear con escafandra  :D


:D :D :D, no pues ni hablar del peluquin, mis respetos amigo escafandra :)

Salud OS
  • 0




IP.Board spam blocked by CleanTalk.