如何在C中返回ascii char的索引

时间:2009-11-17 07:24:01

标签: c

因此,您将表格从英语字母表中的26个ascii字符映射到相应的莫尔斯代码字符串

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

} ALookTab;

和asciiNum为0表示a,1表示b,依此类推。如何返回索引(int),它是莫尔斯字符的索引。

那么在将char转换为数字后我们正在做的是param ascii ascii字符转换并返回给定ascii字符的索引,我们该怎么做?

3 个答案:

答案 0 :(得分:3)

将char转换为索引的最简单的可移植方式是这种类型的构造:

/* 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;
}

答案 1 :(得分:2)

您需要将字符(例如“a”)转换为表格中的索引。根据您的规范,该表以“a”的摩尔斯电码开头,因此“a”应映射到索引0,“b”应映射到1,依此类推。

最简单的这种映射可以像这样实现:

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

从给定的字母中减去“a”的ASCII码,将“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()添加了对这两个函数的调用,以使它们更加健壮。

答案 2 :(得分:2)

请注意,C标准不需要ASCII,并且此代码在EBCDIC下不起作用,但99%的时间这无关紧要。

我相信你所寻找的东西比你想象的要简单得多。像'c''0'这样的字符文字实际上是int s而不是char s - 它们在分配时会被转换为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个数字,然后是您选择的任何顺序的其他特殊字符。