вычитание букв в c

Я хотел бы знать, как "вычитать буквы" в C:
Я имею в виду, что у меня есть 2 буквы, "a" и "c", и я хочу выполнить "c"-'a '='b', что равно 3-1=2.
Как можно получить такое же поведение в C?
Я могу преобразовывать Буквы->Числа, но как управлять ограниченная длина алфавита? Спасибо.


person JJJ    schedule 28.05.2012    source источник
comment
Спасибо за ответы, мне как раз и нужно было учесть тот факт, что в алфавите 26 букв. Я имею в виду, делая то, что вы предлагаете, я не мог бы, например, сделать b-z или b-d.   -  person JJJ    schedule 28.05.2012
comment
Какой результат вы ожидаете при вычислении 'b'-'z'?   -  person Alex Lockwood    schedule 28.05.2012
comment
'b' - 'z' == 'c', twain249 прекрасно понял, спасибо.   -  person JJJ    schedule 28.05.2012


Ответы (2)


вы можете рассматривать буквы как числа, а затем добавить букву 'a' обратно, чтобы нормализовать ее.

so

char c1 = 'a';
char c2 = 'c';
int diff = c2 - c1; //'c' - 'a' = 2
char ans = diff + 'a' - 1; //add 'a' and subtract 1 to normalize it

Если вам нужна разница в числах, просто используйте diff из моего ответа (ans даст вам букву).

Это не будет обертываться так

'a' - 'b' 

приведет к -1 (или символу перед a)

Если вы хотите обрабатывать негативы с помощью обертки, вы должны проверить это.

int diff = c2 - c1;
char ans;
diff > 0 ? ans = diff + 'a' - 1 : 'z' + diff + 1; 

Это даст:

  1. 'z' для 'b'-'c'
  2. 'y' для 'b'-'d'
person twain249    schedule 28.05.2012
comment
Не могли бы вы просто использовать для этого оператор %? -2 % 26 = 24, что вы и так получите с вашим алгоритмом. - person Sasha Chedygov; 28.05.2012
comment
@SashaChedygov Какой в ​​этом смысл? Это только сделало бы код медленнее и труднее для чтения. - person Lundin; 28.05.2012
comment
Отлично, это то, что я искал и не мог найти; но что такое z, ты имел в виду 'z'? - person JJJ; 28.05.2012
comment
Я имел в виду 'z', что вы получаете за 'b'-'c'? - person twain249; 28.05.2012
comment
Я думаю, что % намного приятнее для глаз, но, думаю, каждому свое. - person Sasha Chedygov; 29.05.2012

Вы смотрите это?

char a1,a2,a3;
a3 = a1 - a2 + 'a';
person RolandXu    schedule 28.05.2012
comment
Спасибо за ответ, мне как раз и нужно было учесть тот факт, что в алфавите 26 букв. Я имею в виду, делая то, что вы предлагаете, я не мог бы, например, сделать b-z или b-d. - person JJJ; 28.05.2012
comment
на языке С. 'a' ~ 'z' представлено числом, поэтому вы можете сделать это как целое число. поэтому b - d = -2. - person RolandXu; 28.05.2012
comment
Просто имейте в виду, что подписанность типа char определяется реализацией. Этот код не является переносимым и, возможно, приведет к неопределенному поведению из-за потери значимости целого числа. Например, a3 = 'a' - 'b' + 'a' — это неопределенное поведение в реализациях, где тип char не имеет знака. - person Lundin; 28.05.2012
comment
@Lundin char определяется реализацией, но это не означает, что вычисление char определяется реализацией. Во-первых, компилятор продвигает char к int для вычисления выражения. Во-вторых, в стандарте C99 6.2.5 говорится, что если член базового набора символов выполнения хранится в объекте char, его значение гарантированно будет положительным. - person RolandXu; 28.05.2012
comment
@RolandXu Целое число -1 не принадлежит ни одному известному набору символов, поэтому никаких гарантий нет. Основная проблема здесь в том, что символы повышаются до int, что гарантированно будет подписано. Но затем результат снова запихивается обратно в char. Если бы результат был сохранен в int, а не в char, код был бы безопасным. - person Lundin; 28.05.2012
comment
@Lundin Конечно, если значение выходит за пределы диапазона символов, результат не определен. Но значение, тип int, выражения хорошо определено. если значение карты в диапазоне символов, результат также хорошо определен. - person RolandXu; 28.05.2012