Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.09.06;
Скачать: CL | DM;

Вниз

Сравнение строк - как правильно ?   Найти похожие ветки 

 
b/@. ©   (2009-07-08 10:39) [0]

Доброе утро.

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

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

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

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


 
clickmaker ©   (2009-07-08 11:18) [1]

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


 
Palladin ©   (2009-07-08 11:19) [2]


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

S1 = S2

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


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

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

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

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

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

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

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


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

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

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


 
b/@. ©   (2009-07-08 11:51) [5]

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

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

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


 
b/@. ©   (2009-07-08 11:54) [6]


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

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


 
Palladin ©   (2009-07-08 11:54) [7]


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

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


 
clickmaker ©   (2009-07-08 11:54) [8]

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

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


 
Anatoly Podgoretsky ©   (2009-07-08 12:09) [9]

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

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


 
b/@. ©   (2009-07-08 12:18) [10]

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

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 - достаточно было и простого сравнения :)


 
clickmaker ©   (2009-07-08 12:48) [11]

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

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


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

Result := Params.Values[ParamName]

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


 
TIF ©   (2009-07-08 21:30) [13]

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

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

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


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


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


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

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

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



Страницы: 1 вся ветка

Текущий архив: 2009.09.06;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.018 c
15-1247208288
Внук
2009-07-10 10:44
2009.09.06
Пятничная задачка


15-1246624006
Бисовецкий Андрей
2009-07-03 16:26
2009.09.06
Помогите найти правильное решение баз данных. ПОМОГИТЕ СРОЧНО!!


15-1246640964
Тимохов_
2009-07-03 21:09
2009.09.06
Как узнать позицию каретки в TEdit?


15-1245256088
Павел Калугин
2009-06-17 20:28
2009.09.06
Ура, я инжинер.


15-1246981094
Дмитрий С
2009-07-07 19:38
2009.09.06
Как оптимальнее организовать оповещения о событиях