Как получить положение символа в алфавите на языке C?

Вы уверены, что действительно хотите это сделать? Умножение decimal примерно в 40 раз медленнее, чем double, поэтому я ожидаю, что десятичное число Math.Pow() будет практически неприменимо.

Однако, если вы ожидаете только целочисленные полномочия, я предлагаю вам использовать алгоритм вычислений на основе целочисленных значений, который уже обсуждался здесь в SO.

8
задан kluka 5 November 2012 в 15:24
поделиться

3 ответа

int position = 'g' - 'a' + 1;

В языке C значения char преобразуются в значения int и принимают свои значения ASCII. В этом случае 'a' совпадает с 97, а 'g' равно 103. Поскольку алфавит является непрерывным в наборе символов ASCII, вычитая 'a' от вашего значения дает его относительное положение. Добавьте 1, если вы считаете 'a' первой (а не нулевой) позицией.

28
ответ дан 5 December 2019 в 05:03
поделиться

Это будет работать с EBCDIC без учета регистра:

#include <ctype.h>
#include <stdio.h>
#include <string.h>

int getpos (char c)
{
    int pos;
    const char * alphabet = "abcdefghijklmnopqrstuvwxyz";
    const char * found;

    c = tolower ((unsigned char)c);
    found = strchr (alphabet, c);
    pos = found - alphabet;
    if (!found)
        pos = 0;
    else if (pos == 26)
        pos = 0;
    else
        pos++;
    return pos;
}

int main ()
{
    char tests[] = {'A', '%', 'a', 'z', 'M', 0};
    char * c;
    for (c = tests; *c; c++) {
        printf ("%d\n", *c - 'a' + 1);
        printf ("%d\n", getpos (*c));
    }
    return 0;
}

См. http://codepad.org/ 5u5uO5ZR , если вы хотите его запустить.

4
ответ дан 5 December 2019 в 05:03
поделиться

Вам также, вероятно, следует учитывать верхний / нижний регистр. По моему опыту, считать от 1 часто опасно, потому что это может привести к единичным ошибкам. Как правило, я всегда конвертирую в индекс, отсчитывающий от единицы, только при взаимодействии с пользователем, и использую внутренний подсчет на основе 0, чтобы избежать путаницы.

int GetPosition(char c)
{
   if (c >= 'a' && c <= 'z') {
      return c - 'a';
   }
   else if (c >= 'A' && c <= 'Z') {
      return c - 'A';
   }
   else  {
      // Indicate that it isn't a letter.
      return -1;
   }
}
3
ответ дан 5 December 2019 в 05:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: