#c #char #comparison #uppercase #lowercase
#c #обуглить #сравнение #верхний регистр #строчные
Вопрос:
где-то в коде для сравнения двух строк я видел это:
#define A_to_a ('a'-'A') ... for (i = 0; i lt; n; i ) { if (!(word[i] == (tmpP -gt; word[i])) amp;amp; !(word[i] == (tmpP -gt; word[i] A_to_a)) amp;amp; !(word[i] == (tmpP -gt; word[i] - A_to_a)) { found = 0; break; } } if (i==n) { found = 1; break; }
Я предполагаю, что он хочет рассмотреть сходство в верхнем и нижнем регистре, но как это работает с фразой A_to_a?
Комментарии:
1. Правильный способ сделать это-использовать
tolower
функцию изlt;ctype.hgt;
, напримерif (tolower(word[i]) != tolower(tmpP-gt;word[i]))
Ответ №1:
'a' - 'A'
это просто целое число. Если вы добавите это число к прописной букве, вы получите строчную букву.
!(word[i] == (tmpP -gt; word[i]))
проверяет, не совпадают ли они!(word[i] == (tmpP -gt; word[i] A_to_a))
.tmpP -gt; word[i] A_to_a
преобразуетсяtmpP -gt; word[i]
в нижний регистр и проверяет, не совпадает ли он сword[i]
.!(word[i] == (tmpP -gt; word[i] - A_to_a))
.tmpP -gt; word[i] - A_to_a
преобразуетсяtmpP -gt; word[i]
в верхний регистр и проверяет, не совпадает ли он сword[i]
.
Если все три образуют сравнение без учета регистра.
Но хороший код должен использовать стандартные функции toupper
или tolower
. Приведенный выше код просто не годится.
Ответ №2:
Это просто плохой код.:)
Например, вместо этого оператора if
if (!(word[i] == (tmpP -gt; word[i])) amp;amp; !(word[i] == (tmpP -gt; word[i] A_to_a)) amp;amp; !(word[i] == (tmpP -gt; word[i] - A_to_a)) {
этого будет достаточно, чтобы написать
if ( !( toupper( ( unsigned char )word[i] ) == toupper( ( unsigned char )tmpP-gt;word[i] ) ) )
это более понятно и безопаснее.
Макрос
#define A_to_a ('a'-'A')
служит для преобразования букв либо в верхний, либо в нижний регистр. Но это небезопасно и может привести к неожиданному результату, используемому в условиях исходного оператора if.
Например, если у вас есть
char c = 'B';
затем, чтобы преобразовать эту переменную в нижний регистр, вы можете написать
c - 'A' 'a'
это эквивалентно
'B' - 'A' 'a'
Как 'B' - 'A'
равно 1
тогда 1 'a'
дает 'b'
.
Приведенное выше выражение может быть записано с помощью макроса типа
c A_to_a
которые производят
c 'a' - 'A'
это то же самое, что и написанное выше выражение
c - 'A' 'a'
Комментарии:
1. Я думаю, что в вашем ответе есть ошибка. Включение круглых скобок в
A_to_a
макрос устраняет неоднозначность порядка операций.2. @Крис, о какой двусмысленности ты говоришь?
3. Вопрос определяет макрос как
#define A_to_a ('a'-'A')
, а не#define A_to_a 'a'-'A'
как, поэтомуc - A_to_a
производитc - ('a'-'A')
, а неc - 'a'-'A'
как .