替代C中的switch语句

我在下面发布的代码是我整个程序的一部分。其余代码与此问题无关。除了使用这个长switch语句之外还有其他解决方案吗?主要目标是缩短代码。该if语句仅用于将小写字母大写。

int POINTS[] = { 1, 3, 3, 2, 1, 4, 2, 4, 1, 8, 5, 1, 3, 1, 1, 3, 10, 1, 1, 1, 1, 4, 4, 8, 4, 10 };

int compute_score(string word)
{
  // TODO: Compute and return a score for string
  int word_length = strlen(word);
  int i, sum = 0;

  for (i = 0; i < word_length; i++)
  {
    //This if statement is used to captalise lower-case letters.
    if (islower(word[i]))
    {
      word[i] = toupper(word[i]);
    }

    //This switch statement is the key in this program. It will check 
    //each letter of word and then modify variable sum according to it.
    switch (word[i])
    {
    case 'A':
      sum = sum + POINTS[0];
      break;
    case 'B':
      sum = sum + POINTS[1];
      break;
    case 'C':
      sum = sum + POINTS[2];
      break;
    case 'D':
      sum = sum + POINTS[3];
      break;
    case 'E':
      sum = sum + POINTS[4];
      break;
    case 'F':
      sum = sum + POINTS[5];
      break;
    case 'G':
      sum = sum + POINTS[6];
      break;
    case 'H':
      sum = sum + POINTS[7];
      break;
    case 'I':
      sum = sum + POINTS[8];
      break;
    case 'J':
      sum = sum + POINTS[9];
      break;
    case 'K':
      sum = sum + POINTS[10];
      break;
    case 'L':
      sum = sum + POINTS[11];
      break;
    case 'M':
      sum = sum + POINTS[12];
      break;
    case 'N':
      sum = sum + POINTS[13];
      break;
    case 'O':
      sum = sum + POINTS[14];
      break;
    case 'P':
      sum = sum + POINTS[15];
      break;
    case 'Q':
      sum = sum + POINTS[16];
      break;
    case 'R':
      sum = sum + POINTS[17];
      break;
    case 'S':
      sum = sum + POINTS[18];
      break;
    case 'T':
      sum = sum + POINTS[19];
      break;
    case 'U':
      sum = sum + POINTS[20];
      break;
    case 'V':
      sum = sum + POINTS[21];
      break;
    case 'W':
      sum = sum + POINTS[22];
      break;
    case 'X':
      sum = sum + POINTS[23];
      break;
    case 'Y':
      sum = sum + POINTS[24];
      break;
    case 'Z':
      sum = sum + POINTS[25];
      break;
    }
  }
  return sum;
}

回答

我猜你想要这样的东西,只是没有费心在你的switch语句中正确设置所有索引:

if ('A' <= word[i] && word[i] <= 'Z') {
    sum += POINTS[word[i] - 'A'];
}

诀窍是chars 也只是数字,因此您可以比较它们以查看字符是否为大写拉丁字母,然后减去'A'以获得POINTS数组中从 0 开始的位置。

但是请注意,这只是工作,如果你的目标系统上的字符集包含字母A,通过Z连续按字母顺序排列。目前为止,大多数系统都使用(超集)ASCII,上面的代码可以正常工作。但是,如果使用更奇特的字符集(例如 EBCDIC),您将需要不同的方法,例如查找表、哈希表或……大switch语句。


以上是替代C中的switch语句的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>