怎样能判断一字符在一字符串中出现的次数?(30分)

G

geyufly

Unregistered / Unconfirmed
GUEST, unregistred user!
怎样能判断一字符在一字符串中出现的次数?
 
var
iPos,iCount:integer;
iCount:=0;

while pos(找的字符'',s)>0 do
begin
inc(iCount);
Delete(s,pos(找的字符'',s),1);
end;
iCount就是出现的次数
 
var
p: PChar;
iCount: Integer;

p := pchar(s);
iCount := 0;
repeat
p := strscan(p, c);
if p <> nil then
begin
inc(iCount);
inc(p);
end;
until (p = nil) or (Integer(p)-integer(s)>=length(s));

不必修改源串
 
把我的作成一个函数,也不会修改字符串
 
不必修改源串也可以呀,只要把张无忌源代码中的S赋给一个变量就可以了
 
效率低了点吧? 每找到一次都需要在内存中复制整个字符串。
即使是
for i := 1 to length(s) do
if s=c then
inc(iCount);
都比你代码的效率高哦。
 
如果是中文了?
 
一样呀。
只要把上面 s=c 改成 (s=c[1]) and (s[i+1]=c[2])就可以了。
反正修改源串(不管是不是赋给另外的变量)都会引起整个字符串的复制, 太浪费了。
 
for i := 1 to length(s) do
if s=c then
inc(isum);
总要引起整个字符串的复制的阿,要不然怎么办?全要用来判断的阿

 
to Pearl:
把我的代码做成一个函数,那有什么问题,你不可能在要查找字符位置的
部分都用你的代码,这样一点都没有效率,而且容易出错,作成函数如果
不用指针都要复制字符串。你我代码之间就没有什么差别了
 
看看这个。
function ReplaceAll( S : string; Const sFind, sReplace : string; IsIgnoreCase : Boolean = False ) : string;
var
Rec, iLenFind, iLenRep : Integer;
s1, s2, sTemp : string;
begin
result := S ;
if IsIgnoreCase then
begin
s1 := UpperCase(sFind) ;
s2 := UpperCase(sReplace) ;
end else
begin
s1 := sFind;
s2 := sReplace;
end;
if s1 = s2 then Exit;
iLenFind := Length(sFind) ;
iLenRep := Length(sReplace);
rec := 1;
while rec <= Length(S) - iLenFind + 1 do
begin
sTemp := Copy(S, rec, iLenFind);
if IsIgnoreCase then
sTemp := UpperCase(sTemp);
if sTemp = s1 then
begin
Delete( Result, Rec, iLenFind );
Insert( sReplace, Result, Rec );
Rec := Rec + iLenRep;
end else
begin
rec := rec + 1;
end;
end;
end;
 
int GetNum( char* strSource,char c )
{
int i;
int num;

for( i=0;i<strlen(strSource);i++ )
{
if( strchr(strSource+i,c) != 0 )
num++;
}
return num;
}
 
不好意思,刚才写错了。

int GetCharNum( char* strSource,char c )
{
int i;
int num;

for( i=0;i<strlen(strSource);i++ )
{
if( strSource == c )
num++;
}
return num;
}
 
To张无忌
如果函数参数用var或者const就不会在堆栈中复制整个字符串, 而是传递字符串的首地址哦。
即使不用var或const, 那么我的做成函数也只复制一次。 而您的呢?
每一次调用Insert和Delete都将复制字符串, 这也太过分了吧?
 
我知道VAR就是用的指针来传递参数,我上面的话后面就是这个意思........
抱歉,我没有看到什么资料上说INSERT和Delete要复制字符串,用DELPHI的一些函数,
简单好用,比自己写效率我想应该是要高一些把。
还有如果是中文,你要根据情况来选用不同的函数,是不是太麻烦了?
 
不用呀, 下面代码不管是不是中文都能正确查询, 而且只扫描字符串一次, 不存在复制, 应当说效率相当高了:
function findcount(const s, sFind: string): Integer;
var
i: Integer;
begin
i := 1;
result := 0;
while i <= length(s)-length(sFind)+1 do
if comparemem(@(s), @(sFind[1]), length(sFind)) then
begin
inc(result);
inc(i, length(sFind));
end
else if byte(s)>128 then
inc(i, 2)
else inc(i);
end;
 
好像里问题元了点,人家只问字符吗?
to chur
for i := 1 to length(s) do
if s=c then
inc(isum);
总要引起整个字符串的复制的阿,要不然怎么办?全要用来判断的阿
什麽意思???
哪里引起整个字符串的复制???
length(s)在这里只进行一次表达式计算。
 
接受答案了.
 
顶部