function GetToken(aString, SepChar: String; TokenNum: Byte):String; { параметры: aString : полная строка SepChar : единственный символ, служащийразделителем между словами (подстроками)TokenNum: номер требуемого слова (подстроки))result : искомое слово или пустая строка, если количество слов меньше значения 'TokenNum'} var Token : String;StrLen : Byte;TNum : Byte;TEnd : Byte; begin StrLen := Length(aString);TNum := 1;TEnd := StrLen;while ((TNum <= TokenNum) and (TEnd <> 0)) dobeginTEnd := Pos(SepChar,aString);if TEnd <> 0 thenbeginToken := Copy(aString,1,TEnd-1);Delete(aString,1,TEnd);Inc(TNum);endelsebeginToken := aString;end;end;if TNum >= TokenNum thenbeginGetToken1 := Token;endelsebeginGetToken1 := '';end;end; function NumToken(aString, SepChar: String):Byte; { parameters: aString : полная строка SepChar : единственный символ, служащийразделителем между словами (подстроками)result : количество найденных слов (подстрок) } var RChar : Char;StrLen : Byte;TNum : Byte;TEnd : Byte; begin if SepChar = '#' thenbeginRChar := '*'endelsebeginRChar := '#'end;StrLen := Length(aString);TNum := 0;TEnd := StrLen;while TEnd <> 0 dobeginInc(TNum);TEnd := Pos(SepChar,aString);if TEnd <> 0 thenbeginaString[TEnd] := RChar;end;end;Result := TNum;end; |
Или другое решение:
function CopyColumn( const s_string: string; c_fence: char; i_index: integer ): string; var i, i_left: integer; begin result := EmptyStr;if i_index = 0 then beginexit;end;i_left := 0;for i := 1 to Length( s_string ) do beginif s_string[ i ] = c_fence then beginDec( i_index );if i_index = 0 then beginresult := Copy( s_string, i_left + 1, i - i_left - 1 );exit;end else begini_left := i;end;end;end;Dec( i_index );if i_index = 0 then beginresult := Copy( s_string, i_left + 1, Length( s_string ));end;end; |
Я знаю что в GetToken параметр SepChar (в моем случае c_fence) строка, не символ, но комментарий гласит, что функция ожидает единственный символ в этой строке, и это очевидно, поскольку если вы пошлете более одного символа, функция попросту несработает. ( Delete(aString,1,TEnd) будет ошибкой, если Length( SepChar ) > 1 ). [000251]