我正在创建一个程序,我在其中搜索字符串中的元音,并且在找到它们之后,需要从字符串中删除元音。
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] := ''
但错误
不兼容的类型:'Char'和'String'“出现
如何从字符串中删除元音?
答案 0 :(得分: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 :(得分: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;
David的代码可能更快,但是这个代码不需要任何额外的字符串。此外,这个也照顾大写元音(如果这是你想要的)。
答案 2 :(得分: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 实现了什么。
答案 3 :(得分: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
是如此之慢
如果string是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(I)只是为了表明删除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.