Какова цель A_to_a в этом сравнении строк?

#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' это просто целое число. Если вы добавите это число к прописной букве, вы получите строчную букву.

  1. !(word[i] == (tmpP -gt; word[i])) проверяет, не совпадают ли они
  2. !(word[i] == (tmpP -gt; word[i] A_to_a)) . tmpP -gt; word[i] A_to_a преобразуется tmpP -gt; word[i] в нижний регистр и проверяет, не совпадает ли он с word[i] .
  3. !(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' как .