Я хотел бы знать, как "вычитать буквы" в C:
Я имею в виду, что у меня есть 2 буквы, "a" и "c", и я хочу выполнить "c"-'a '='b', что равно 3-1=2.
Как можно получить такое же поведение в C?
Я могу преобразовывать Буквы->Числа, но как управлять ограниченная длина алфавита? Спасибо.
вычитание букв в c
Ответы (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;
Это даст:
'z'
для'b'-'c'
'y'
для'b'-'d'
person
twain249
schedule
28.05.2012
Не могли бы вы просто использовать для этого оператор
%
? -2 % 26 = 24
, что вы и так получите с вашим алгоритмом.
- person Sasha Chedygov; 28.05.2012
@SashaChedygov Какой в этом смысл? Это только сделало бы код медленнее и труднее для чтения.
- person Lundin; 28.05.2012
Отлично, это то, что я искал и не мог найти; но что такое z, ты имел в виду 'z'?
- person JJJ; 28.05.2012
Я имел в виду 'z', что вы получаете за 'b'-'c'?
- person twain249; 28.05.2012
Я думаю, что
%
намного приятнее для глаз, но, думаю, каждому свое.
- person Sasha Chedygov; 29.05.2012
Вы смотрите это?
char a1,a2,a3;
a3 = a1 - a2 + 'a';
person
RolandXu
schedule
28.05.2012
Спасибо за ответ, мне как раз и нужно было учесть тот факт, что в алфавите 26 букв. Я имею в виду, делая то, что вы предлагаете, я не мог бы, например, сделать b-z или b-d.
- person JJJ; 28.05.2012
на языке С. 'a' ~ 'z' представлено числом, поэтому вы можете сделать это как целое число. поэтому b - d = -2.
- person RolandXu; 28.05.2012
Просто имейте в виду, что подписанность типа char определяется реализацией. Этот код не является переносимым и, возможно, приведет к неопределенному поведению из-за потери значимости целого числа. Например,
a3 = 'a' - 'b' + 'a'
— это неопределенное поведение в реализациях, где тип char не имеет знака.
- person Lundin; 28.05.2012
@Lundin char определяется реализацией, но это не означает, что вычисление char определяется реализацией. Во-первых, компилятор продвигает char к int для вычисления выражения. Во-вторых, в стандарте C99 6.2.5 говорится, что если член базового набора символов выполнения хранится в объекте char, его значение гарантированно будет положительным.
- person RolandXu; 28.05.2012
@RolandXu Целое число -1 не принадлежит ни одному известному набору символов, поэтому никаких гарантий нет. Основная проблема здесь в том, что символы повышаются до int, что гарантированно будет подписано. Но затем результат снова запихивается обратно в char. Если бы результат был сохранен в int, а не в char, код был бы безопасным.
- person Lundin; 28.05.2012
@Lundin Конечно, если значение выходит за пределы диапазона символов, результат не определен. Но значение, тип int, выражения хорошо определено. если значение карты в диапазоне символов, результат также хорошо определен.
- person RolandXu; 28.05.2012
'b'-'z'
? - person Alex Lockwood   schedule 28.05.2012