Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.09.06;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.007 c
15-1246915719
DillerXX
2009-07-07 01:28
2009.09.06
Подскажите пожалуйста автора и название?


1-1214066182
X9
2008-06-21 20:36
2009.09.06
Открыть диалог поиска текста в WebBrowser


2-1245366914
DimonS
2009-06-19 03:15
2009.09.06
Ошибка при подключении к *.xls


1-1213532081
Student
2008-06-15 16:14
2009.09.06
Свободная память + TStringGrid


15-1247053069
Дуб
2009-07-08 15:37
2009.09.06
О чем собственно говорит иностранец?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский