Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сравнение строк - как правильно ? [D7, XP]


b/@. ©   (2009-07-08 10:39:00) 

Доброе утро.

Интересует такой вопрос - как нужно правильно сравнивать между собой на равенство строки string?

Я обычно сравниваю по старинке как S1 = S2, иногда привожу к одному регистру через LowerCase.

Но заметил что в исходникак VCL строки часто сравниваются не с =, а спомощью функций CompareStr, AnsiCompareStr, AnsiCompareTextи подобных.

Так чем же грозит сравнивание S1 = S2и как правильно сравнивать строки ?


b/@.   (2009-07-09 11:00:00) [1]


> clickmaker ©   (08.07.09 12:48) [11]
> достаточно было и Params.IndexOfName )


> Игорь Шевченко ©   (08.07.09 20:54) [12]
> Result := Params.Values[ParamName]
>
> а нафига - я не понимаю, функция должна возвращать значения, а удалять - отдельная процедура(если так хочется удалить из параметров)

В данном случае можно уже писать и так - раньше там было больше операторов, имменя для этого мне нужен был обратный цикл.

Erase при этом нафига - для того чтобы отделить обработанные параметры от необработанных. Например нужно просто узнать из параметров имя пользователя - для этого достаточно и Values[ParamName], но иногда имя пользователя нужно занести в одно поле - а остальные параметры в мемо.


TIF   (2009-07-08 21:30:00) [2]

> Просто прочитал статью
> http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1206
> поразился множеству вариантов сравнения

Странно. " Compare" в тексте статьи встречается всего 1 раз :)

Это связано с тем, что функция AnsiPos использует функции StrPos и CompareString, предназначенные для работы со строками PChar ...


Игорь Шевченко   (2009-07-08 20:54:00) [3]

Result := Params.Values[ParamName]

а нафига Erase при этом - я не понимаю, функция должна возвращать значения, а удалять - отдельная процедура(если так хочется удалить из параметров)


clickmaker   (2009-07-08 12:48:00) [4]

> достаточно было и простого сравнения

достаточно было и Params.IndexOfName )


b/@.   (2009-07-08 12:18:00) [5]

Вот для примера кусок кода:

const
 PARAM_Username = 'user_name';
 PARAM_Password = 'password';

function GetParamValue(Params: TStrings; const ParamName: string; Erase: boolean = false): string;
var
 i: integer;
begin
 result := '';
 for i := Params.Count -1 downto 0 do
// а можно написать и вот так
//  if Params.Names[i] = ParamName
   if  0 = AnsiCompareText(Params.Names[i], ParamName)
   then begin
     result := Params.ValueFromIndex[i];
     if Erase
     then Params.Delete(i);
     break;
   end;
end;

Понимаю теперь - что зря я втулил AnsiCompareText- достаточно было и простого сравнения :)


Anatoly Podgoretsky   (2009-07-08 12:09:00) [6]

> b/@.  (08.07.2009 11:54:06)  [6]

Фокуса нет, здесь нужен еще и TRIM кроме регистронезависимого сравнения.


b/@.   (2009-07-08 11:54:00) [7]


> Anatoly Podgoretsky ©   (08.07.09 11:45) [4]
> ''ABC и 'ABC  ' - это разные или одинаковые строки?

Если набранные только латиницей или только кирилицей - то одинаковые. В чём фокус ?


Palladin   (2009-07-08 11:54:00) [8]


> Т.е. если мне нужно сравнивать на посимвольное равенство
> - то метод S1 = S2 вполне рабочий ?

а в чем сомнения? конечно


clickmaker   (2009-07-08 11:54:00) [9]

> И еще смутило то, что для CompareStr используется функция,
> написанная на ассемблере, но уже для AnsiCompareStr - функция
> WinAPI

а чего смущаться? CompareString - она как раз с учетом локали может сравнивать


b/@.   (2009-07-08 11:51:00) [10]

Т.е. если мне нужно сравнивать на посимвольное равенство - то метод S1 = S2вполне рабочий ?

Просто прочитал статью http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1206
поразился множеству вариантов сравнения, и стали меня одолевать смутные сомнения, что я чегото неправильно делаю.

И еще смутило то, что для CompareStrиспользуется функция, написанная на ассемблере, но уже для AnsiCompareStr- функция WinAPI.


Anatoly Podgoretsky   (2009-07-08 11:45:00) [11]

> b/@.  (08.07.2009 10:39:00)  [0]

''ABC и 'ABC  ' - это разные или одинаковые строки?


Сергей М.   (2009-07-08 11:20:00) [12]

Если только на равенство и без учета тек.локали, то вариант S1=S2 вполне достаточен.

CompareStr - регистрочувствительное сравнение на меньше/равно/больше без учета тек.локали

CompareText - регистро нечувствительное сравнение на меньше/равно/больше без учета тек.локали

AnsiCompareStr - регистрочувствительное сравнение на меньше/равно/больше с учетом тек.локали

AnsiCompareText - регистро нечувствительное сравнение на меньше/равно/больше с учетом тек.локали.

Что "правильней" - это решать тебе в каждом конкретном случае.


Palladin   (2009-07-08 11:19:00) [13]


> как правильно сравнивать строки ?

S1 = S2

все остальное имеет отношение к сравнению текста, ибо строка это тип переменной


clickmaker   (2009-07-08 11:18:00) [14]

AnsiCompareStr сравнивает с учетом локали. CompareStr может не работать на национальных алфавитах


Наверх

Титульная страница Поиск, карта сайта Написать письмо