2013-08-27 34 views
0

我正在创建一个程序,我正在搜索字符串中的元音,并且在找到元音之后,需要从字符串中删除元音。在delphi中创建一个等于nill值的字符变量

mystring := 'August' ; 

{if mystring[1] IN ['A','E','I','O','U'] ;} 
for k := 1 to length(mystring) DO 
BEGIN 
if mystring[K] IN ['a','e','i','o','u'] 
then mystring[k] := '' 

但错误

不兼容的类型: '字符' 和 '串'“出现

我能做些什么,从我的字符串删除元音

+0

空字符串''''不是字符。这是呃空弦。你正在使用哪个版本的Delphi?你可以在你的问题中添加一个Delphi版本标签吗? – TLama

+0

使用#0而不是''作为mystring [k]:=''' – Alexandr

+1

@Alexandr不,不要那样做。想想当你把字符串放进编辑控件时会发生什么。 –

回答

4

你正在寻找的是null字符值。使用空字符串,它是一个长度为零的实体。但是没有长度不为零的字符。 null您正在查找的字符值根本不存在。

看到这个的另一种方法是考虑什么Length(mystring)在你的循环结束。无论您使用mystring[k] := ...分配的字符是什么,mystring的长度都不会被修改。

所以,你可以做一个新的字符串,而不是修改现有的字符串。例如:

var 
    new: string; 
    len: Integer; 
.... 
SetLength(new, Length(mystring)); 
len := 0; 
for i := 1 to Length(mystring) do 
begin 
    if not (mystring[i] in ['a','e','i','o','u']) then 
    begin 
    inc(len); 
    new[len] := mystring[i]; 
    end; 
end; 
SetLength(new, len); 
mystring := new; 

或者你可以把重复调用StringReplace

mystring := StringReplace(mystring, 'a', '', [rfReplaceAll]); 
mystring := StringReplace(mystring, 'e', '', [rfReplaceAll]); 
//etc. 

这个版本使用StringReplace比第一种方法更慢。

另一种方法是在地方工作:

var 
    len: Integer; 
.... 
len := 0; 
for i := 1 to Length(mystring) do 
begin 
    if not (mystring[i] in ['a','e','i','o','u']) then 
    begin 
    inc(len); 
    mystring[len] := mystring[i]; 
    end; 
end; 
SetLength(mystring, len); 
1

或者这一个:

VAR 
    I : Cardinal; 

BEGIN 
    I:=1; 
    WHILE I<=LENGTH(MyString) DO 
    IF MyString[I] IN ['a','e','i','o','u','A','E','I','O','U'] THEN 
     DELETE(MyString,I,1) 
    ELSE 
     INC(I) 
END; 

大卫的代码可能更快,但是这一次不需要任何额外的字符串。此外,这一个还负责大写元音(如果这是你想要的)。

+1

这需要一个额外的字符串,每次你调用'删除' –

+0

真的吗?编译器似乎有点低效。我会就地移动字符(如果引用计数= 1)。编译器优化的空间,然后... – HeartWare

+0

有一个realloc。 –

1

又一个建议,你的评价:

for i := 1 to Length(mystring) do 
    if mystring[i] in ['a', 'e', 'i', 'o', 'u'] then 
    mystring[i] := #1; 
mystring := StringReplace(mystring, #1, '', [rfReplaceAll]); 

的IDEIA由字符#1#0不工作),以取代所有的元音。循环做到了。然后,所有#1通过将其替换为空字符串来删除,函数实现了什么StringReplace

1

你可以不喜欢它:

localStr:=mystring; 
mystring:=''; 
if ... then mystring:=mystring+localStr[i]; 

例如

mystring:= 'August'; 
... 

var 
localStr: string; 
i  : Integer; 
begin 
localStr:=mystring; 
mystring:=''; 
for i := 1 to Length(localStr) do if NOT ((localStr[i] in ['a','e','i','o','u'])) then 
       mystring:=mystring+localStr[i]; 
end; 

结果了mystring:Agst


对于专家:

从没想过StringReplace只有一个符号,太慢了。
如果字符串是474000字节。这个测试需要2分5秒。

User  Code in short 
-------------------------------------------- 

David  inc(len) | new[len] := mystring[i] | SetLength(new, len) 
David 2. inc(len) | mystring[len] := mystring[i] | SetLength(mystring, len) 
TLama  if not (C^ in CharSet) then | localStr[I] := C^ | Inc(I) 
Me   localStr:=mystring | mystring:='' | mystring:=mystring+localStr[i] 
AlexSc  mystring := StringReplace(mystring, #1, '', [rfReplaceAll]) 
HeartWare I := 1     | WHILE I<=LENGTH(MyString) DO | DELETE(MyString,I,1) | INC(I) 
" DEC(I) I := LENGTH(MyString) | WHILE I > 0 DO    | DELETE(MyString,I,1) | DEC(I) 

HeartWare可DEC(我)只是表明删除DOWNTO更快

在几秒钟的测试。

  length(mystring)--MB-------------------- 
      0.474  1.049  4.002  7.995  15.358  56.948 
----------------------------------------------------     
Delphi 5 on XP 
----------------------------------------------------    
TLama : 0.003  0.016  0.047  0.078  0.172  0.687 
David : 0.003  0.016  0.047  0.093  0.192  0.765 
David 2.: 0.003  0.016  0.063  0.109  0.219  0.875 

Me  : 0.125  0.281  1.109  2.192  4.203 
HeartWare: 27.284  131.057 
" DEC(I): 21.793  108.406 
AlexSc : 143.723  break > 8 min. 

Rad XE4 on vista 
----------------------------------------------------    
TLama : 0.003  0.032  0.068  0.139  0.194 
David : 0.003  0.032  0.068  0.146  0.203 
Me  : 0.094  0.172  0.481  0.921  1.576 
HeartWare: 23.056  119.076 
" DEC(I): 17.519  103.319 
AlexSc : 125.082  break > 8 min. 
+0

@TLama:测试你的代码有点慢。 (简短版本'CharSet = ['a','e','i','o','u'];') –

+0

大卫的第二个入口(就地)如何?我猜想一个是最快的(对他的第一个入口来说是一个很小的空白)。 – HeartWare

+0

@HeartWare:1.条目,'mystring = 0.474 MB'。 2.输入'mystring = 1.049 MB'。 –

相关问题