[RESUELTO] Como eliminar espacios en el centro de una cadena?
#1
Escrito 10 junio 2010 - 12:27
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
Escrito 10 junio 2010 - 12:47
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
Escrito 10 junio 2010 - 12:54
Puedes combinar las funciones Pos y Copy.
#4
Escrito 10 junio 2010 - 02:02
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;
Pero se me hace muy parecido a lo de egostar
#5
Escrito 10 junio 2010 - 02:05
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
Escrito 10 junio 2010 - 02:07
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
Escrito 10 junio 2010 - 02:32
LsVar := AnsiReplaceStr(Texto,' ','');
Edito: por no leer todo el problema he posteado una solución que no aplica
#8
Escrito 10 junio 2010 - 02:53
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
Escrito 10 junio 2010 - 03:04
En fin... que bien que ya lo hayas solucionado...
Saludox !
#10
Escrito 10 junio 2010 - 03:07
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
Escrito 10 junio 2010 - 03:39
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
Escrito 10 junio 2010 - 04:10
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 .... 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 !
#13
Escrito 10 junio 2010 - 04:21
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
Escrito 10 junio 2010 - 04:48
Apoyo la moción con un poco de C:
Usando punteros lo hace cualquiera ¿quien se anima con asm?
#15
Escrito 10 junio 2010 - 04:55
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
Escrito 10 junio 2010 - 07:25
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
Escrito 11 junio 2010 - 06:55
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
Escrito 11 junio 2010 - 07:16
#19
Escrito 11 junio 2010 - 07:18
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 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
#20
Escrito 11 junio 2010 - 07:31
Jajaja, no se puede bromear con escafandra
, no pues ni hablar del peluquin, mis respetos amigo escafandra
Salud OS