Как вернуть индекс ascii char в C - PullRequest
0 голосов
/ 17 ноября 2009

Итак, у вас есть таблица, отображающая 26 символов ascii из английского алфавита в соответствующие им строки кода Морзе

typedef struct a_look_tab {
    char table[asciiNum][MORSE_MAX+1]; 

} ALookTab;

и asciiNum - это 0 для a, 1 для b и так далее. как вернуть индекс (int), который является индексом азбуки Морзе.

Итак, что мы делаем после преобразования символа в число: param ascii Символ ascii для преобразования и возврата Индекс для данного символа ascii, как нам это сделать?

Ответы [ 3 ]

3 голосов
/ 17 ноября 2009

Простейший переносимый способ преобразования символа в индекс - это конструкция такого типа:

/* Returns -1 if c is not an upper- or lower-case alphabetical character */
int char_to_index(char c)
{
    static const char * const alphabet = "abcdefghijklmnopqrstuvwxyz";
    char *p = strchr(alphabet, tolower((unsigned char)c));

    return p ? p - alphabet : -1;
}
2 голосов
/ 17 ноября 2009

Обратите внимание, что стандарт C не требует ASCII, и этот код не будет работать в EBCDIC, но в 99% случаев это не будет иметь значения.

Я считаю, что то, что вы ищете, намного проще, чем вы думаете. Символьные литералы, такие как 'c' и '0', на самом деле int с, а не char с - они понижаются до char при назначении и могут быть так же легко возвращены. Так вот что (я думаю) вы хотите:

#include <ctype.h> // for tolower()

char *func(ALookTab *a, char c)
{
    if(isalpha(c))
        return a->table[tolower(c) - 'a'];
    if(isdigit(c))
        return a->table[c - '0' + 26];
    // handle special characters
}

Обратите внимание, что в этом коде предполагается, что ваш азбука Морзе хранится в виде 26 букв алфавита, 10 цифр, а затем других специальных символов в любом порядке.

2 голосов
/ 17 ноября 2009

Вам необходимо преобразовать символ, такой как «а», в его индекс в таблице. Согласно вашей спецификации, таблица начинается с азбуки Морзе для «а», поэтому «а» должен отображаться на индекс 0, «б» должен отображаться на 1 и т. Д.

Самое простое такое отображение может быть реализовано так:

int char_to_index(char c)
{
  return tolower(c) - 'a';
}

Это вычитает ASCII-код для «a» из заданной буквы, который превратит «a» в 0 и т. Д.

К сожалению, это работает только в том случае, если компьютер, на котором выполняется программа, кодирует буквы алфавита, используя систему, которая присваивает смежные коды буквам. Не все компьютеры такие. Более переносимая функция может выполнять сопоставление явно, например так:

int char_to_index2(char c)
{
  switch(tolower(c))
  {
  case 'a': return 0;
  case 'b': return 1;
  case 'c': return 2;
  /* and so on */
  }
}

Это более подробный код, но более переносимый.

ОБНОВЛЕНИЕ: Я добавил вызовы к tolower() для обеих функций, чтобы сделать их немного более устойчивыми.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...