Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   strcmp,strcasecmp (https://javascript.ru/forum/server/27364-strcmp-strcasecmp.html)

kilogram 10.04.2012 19:20

strcmp,strcasecmp
 
strcasecmp - проверяет на соотвествие двух строк с учетом регистра.
strcmp - проверяет на соотвествие двух строк без учетом регистра.

<?php
if(strcasecmp('Vas','Vas')) echo 'hi!'; else
echo 'bye ';

if(strcmp('vas','vas')) echo 'hi!'; else
echo ' bye';
?>


a)В первом ифе должно вывести hi! так как Левая строка Vas такая же как правая, но выводит почему то bye.
b)Во втором ифе должно вывести h! так как 2 стоки одинаковы, но выводит опять bye, почему?

T-sh 10.04.2012 19:45

if (strcasecmp('Vas','Vas') == 0){
   echo('Hi'); 
}
else{
   echo('bye'); 
}

T-sh 10.04.2012 19:46

либо
if (!strcasecmp('Vas','Vas')){ 
   echo('Hi'); 
}
else{
   echo('bye'); 
}


upd: так делать не рекомендуется :) если первая строка короче — сработает условие.. лучший и правильный вариант с ==0.

функции strcasecmp и strcmp в случае, если строки идентичны возвращают ноль.. в условиях ноль — это false.

kilogram 10.04.2012 21:24

А почему здесь не вводил проверок на ноль, а сравнил 2 с 1 и выдало hi?
if(strcasecmp(2,1)) echo 'hi!'; else
echo 'bye ';

T-sh 10.04.2012 21:31

если первая строка "больше" (длиннее, либо приоритет символов больше) второй — возвращается единица (т.е. true для условия), поэтому и выполнилось.

в целом так:
если A > B strcasecmp(A,B) = 1
если A < B strcasecmp(A,B) = -1
если A = B strcasecmp(A,B) = 0

kilogram 10.04.2012 21:48

Прошу прощения, в документации написано.

Цитата:

Возвращает отрицательное число, если str1 меньше, чем str2,
http://ua2.php.net/manual/ru/function.strcasecmp.php

Написал так:
if(strcasecmp("Петя","ПЕтя")) echo 'hi!'; else
echo 'bye ';

Здесь str1 меньше чем str2, но возвращает true, а не отрицательное число. Почему?

T-sh 10.04.2012 22:01

сравнение бинарное, по кодам символов у прописной кириллицы приоритет над строчной :) т.е буквы в нижнем регистре на 32 позиции выше, чем буквы в верхнем.

любое сравнение одинаковых буквы в нижнем и верхнем регистрах будет равно 32 :) (если сравнить строчную с прописной, то -32 соответственно)

а 32 > 0, и соответственно = true :)

kilogram 10.04.2012 22:17

А понял прикол, по таблицу ACII приоритет смотрится, получается код заглавной буквы меньше чем маленькой, то есть Петя>ПЕтя и поэтому возвращает тру, спс.

T-sh 10.04.2012 22:21

Цитата:

Сообщение от kilogram (Сообщение 168201)
А понял прикол, по таблицу ACII приоритет смотрится, получается код заглавной буквы меньше чем маленькой, то есть Петя>ПЕтя и поэтому возвращает тру, спс.

да :)


Часовой пояс GMT +3, время: 10:39.