
[RESUELTO] Como eliminar espacios en el centro de una cadena?
#1
Posted 10 June 2010 - 12:27 PM
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
#2
Posted 10 June 2010 - 12:47 PM
procedure TForm1.Button1Click(Sender: TObject); var cadena: string; begin cadena := 'algo de la cadena'; repeat cadena := StringReplace(cadena,' ',' ',[rfReplaceAll]); until pos(' ',cadena) = 0 ; ShowMessage(Cadena); end;
Pero seguro habrá quien lo haga mas fácil

Salud OS
#3
Posted 10 June 2010 - 12:54 PM
Puedes combinar las funciones Pos y Copy.
#4
Posted 10 June 2010 - 02:02 PM
var i: Integer; Str: String; begin Str:= 'Cualquier cosa'; i:= pos(#32#32,Str); while i > 0 do begin delete(Str,i,1); i:= pos(#32#32,Str); end; ShowMessage(Str); end;

#5
Posted 10 June 2010 - 02:05 PM
function EliminarEspacios(Cadena: string): string; var i: integer begin Result := ''; for i := 1 to Length(Cadena) do begin if Cadena[i] <> ' ' then Result := Result + Cadena[i]; end; end;
#6
Posted 10 June 2010 - 02:07 PM
var i: Integer; Str: String; begin Str:= 'Cualquier co sa'; for i:= Length(str) downto 1 do if Copy(Str,i,2) = #32#32 then delete(Str,i,1); ShowMessage(Str); end;
#7
Posted 10 June 2010 - 02:32 PM
LsVar := AnsiReplaceStr(Texto,' ','');
Edito:


#8
Posted 10 June 2010 - 02:53 PM
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
function RemoveBlanks(const Str: string): string; var I: Integer; FirstBlank: Boolean; begin Result := ''; for I := 1 to Length(Str) do begin if Str[i] <> ' ' then begin Result := Result + Str[i]; FirstBlank := True; end else if FirstBlank then begin FirstBlank := False; Result := Result + Str[i] end end end;
#9
Posted 10 June 2010 - 03:04 PM

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

#10
Posted 10 June 2010 - 03:07 PM
Seguro amigo ?... según yo ese detalle se soluciona con el bucle que implementó Egostar
... 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





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



Salud OS
#11
Posted 10 June 2010 - 03:39 PM




Esto ya es otra cosa:
delphi
var i: Integer; Str: String; begin Str:= 'Cualquier co sa'; for i:= Length(str) downto 1 do if Copy(Str,i,2) = #32#32 then delete(Str,i,1); ShowMessage(Str); end;
#12
Posted 10 June 2010 - 04:10 PM
![]()
![]()
La mía también funciona, y son solo tres lineas
Esto ya es otra cosa:
delphi
var i: Integer; Str: String; begin Str:= 'Cualquier co sa'; for i:= Length(str) downto 1 do if Copy(Str,i,2) = #32#32 then delete(Str,i,1); ShowMessage(Str); end;
Es verdad amigo... funciona de perlas

Saludox !

#13
Posted 10 June 2010 - 04:21 PM
void BorraMultiespacios(char *Cadena) { char *D = Cadena; for(char *S=D; *S;) *S == ' ' && *(S+1) == ' ' ? *S++: *D++ = *S++; *D = 0; }
Su uso:
char Cadena[] = "Hola que tal"; BorraMultiespacios(Cadena);
Saludos.
#14
Posted 10 June 2010 - 04:48 PM
Apoyo la moción con un poco de C:






#15
Posted 10 June 2010 - 04:55 PM
Apoyo la moción con un poco de C:
![]()
![]()
Usando punteros lo hace cualquiera
![]()
![]()
¿quien se anima con asm?
; Ya comencé yo... síganle


Saludox !

#16
Posted 10 June 2010 - 07:25 PM
asm
; Ya comencé yo... síganle
![]()
Saludox !
; Ya comencé yo... síganle ; Yo le sigo ;) .model small .stack .data Cadena DB 'Hola que tal$' .code ReplaceStr: mov ax, @data mov ds, ax mov dx, offset Cadena end ReplaceStr
Salud OS
#17
Posted 11 June 2010 - 06:55 AM
![]()
![]()
Usando punteros lo hace cualquiera
![]()
![]()
Con punteros en delphi:
procedure BorraMultiespacios(Cadena: PCHAR); var D, S: PCHAR; begin D:= Cadena; S:= D; while S^<>#0 do begin if(S^ = #32) and ((S+1)^ = #32) then inc(S) else begin D^:= S^; inc(D); inc(S); end; end; D^:= #0; end;
¿quien se anima con asm?
En asm:
void _BorraMultiespacios(char *Cadena) { __asm{ mov edi, Cadena mov esi, edi @loop1: cmp word ptr [esi], 2020h jne short @sigue inc esi jmp @loop1 @sigue: movsb cmp byte ptr [esi], 0 jne short @loop1 mov word ptr [edi], 0h } }
Saludos.
#18
Posted 11 June 2010 - 07:16 AM

#19
Posted 11 June 2010 - 07:18 AM
Seguro amigo ?... según yo ese detalle se soluciona con el bucle que implementó Egostar... 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![]()
![]()
![]()
![]()
Nada nada, la mejor solución es la que te acomoda y no te confunde![]()
![]()
Salud OS
Bueno en realidad no probé esa solucion

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

Pero ya veo que se animaron y han dado mas soluciones de la cuenta


#20
Posted 11 June 2010 - 07:31 AM
Jajaja, no se puede bromear con escafandra




Salud OS