Как проверить, соответствуют ли символьные константы ASCII?

Комментарий к более ранней версии этот ответ мой предупредил меня о том, что я не могу предположить, что 'A', 'B', 'C' и т.д. имеют последовательные числовые значения. Я предполагал, что стандарты языка C или C ++ гарантируют, что это так.

Итак, как мне определить, являются ли значения последовательных букв сами по себе последовательными? Или, скорее, как я могу определить, имеют ли символьные константы, которые я могу выразить в одинарных кавычках, свои коды ASCII для числового значения?

Я спрашиваю, как сделать это как в C, так и в C ++. Очевидно, что C-способ будет работать и в C ++, но если для этого есть средство C ++, мне это тоже интересно. Кроме того, я спрашиваю о новейших соответствующих стандартах (C11, C ++ 17).

2

Решение

Вы можете использовать препроцессор, чтобы проверить, отображается ли определенный символ на кодировку:

#include <iostream>
using namespace std;

int main() {
#if ('A' == 65 && 'Z' - 'A' == 25)
std::cout << "ASCII" << std::endl;
#else
std::cout << "Other charset" << std::endl;
#endif
return 0;
}

Недостатком является то, что вам нужно знать сопоставленные значения заранее.

Числовые символы '0''9' гарантированно появляются в последовательном порядке.

5

Другие решения

… (2) Я ожидаю, что смогу получить расстояние в количестве букв между двумя буквами …

Этот комментарий с указанием вашей цели имеет гораздо больше смысла, чем ваш фактический вопрос! Почему ты не спросил об этом? Ты можешь использовать strchr на массив символов, и strchr не волнует, что такое нативный набор символов, то есть ваш код не будет заботиться о том, что такое нативный набор символов … Например:

char alphabet[] = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz";
ptrdiff_t fubar = strchr(alphabet, 'y') - strchr(alphabet, 'X');
printf("'X' and 'y' have a distance of %tu and a case difference of %tu\n", fubar / 2, fubar % 2);

… как мне определить, являются ли значения последовательных букв сами по себе последовательными?

Значения последовательных буквенных символов являются последовательными по определению, потому что они последовательные буквенные символы. Я знаю, что это не то, что вы имели в виду, но ваш настоящий вопрос иллюстрирует отсутствие планирования и обдумывания, и … глупый вопрос требует глупого ответа.

Вы гораздо лучше программируете таким образом, что тебе все равно какие ценности они имеют. Тем не менее, создайте массив, содержащий символы, которые вас интересуют, проведите цикл по элементам и проверьте на несоответствия. Например:

int is_consecutive(char const *alphabet) {
for (size_t x = 0; alphabet[x] && alphabet[x] + 1 == alphabet[x + 1]; x++);
return !alphabet[x];
}

… как я могу определить, имеют ли символьные константы, которые я могу выразить в одинарных кавычках, свои коды ASCII для числового значения?

Снова с отсутствием смысла, и снова с заботой о ценностях … В качестве альтернативы, построить две таблицы перевода, native_to_ascii а также ascii_to_nativeи отработать это оттуда. Я не помогу вам в этом, потому что это глупое упражнение, включающее использование магических чисел, которые, скорее всего, не нужны для вашей реальной цели.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector