Форум: "Начинающим";
Текущий архив: 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.006 c