2

我有一个函数,它通过循环遍历二维数组并在每次找到有效字符数组中的字符时将一维数组的每个单元格中的计数增加 1 来计算二维数组中唯一字符的数量。然后我循环一维数组,每次找到一个数字大于 0 的单元格时,都会增加一个计数器。如果此数字高于我的结构的高度/宽度,则返回 false。

'。代表一个空白空间,虽然它在程序方案中是有效的,但它不应该算作一个独特的字符。

我想知道是否有一种方法可以创建具有相同功能但更短的函数。

bool uniqueChars (Bookcase *b)
{
   int i, j, chars[8] = {0}, cnt = 0;
   char validChars[10] = {"KRGYBMCW."};

   bNullPoint(b);

   for (i = 0; i < b->height; i++) {
      for (j = 0; j < b->width; j++) {
         b->shelves[i][j] = toupper(b->shelves[i][j]); /* To aid with testing*/
         if (strchr(validChars, b->shelves[i][j])) {
            if (b->shelves[i][j] == 'K') {
               chars[0] += 1;
            }
            if (b->shelves[i][j] == 'R') {
               chars[1] += 1;
            }
            if (b->shelves[i][j] == 'B') {
               chars[2] += 1;
            }
            if (b->shelves[i][j] == 'G') {
               chars[3] += 1;
            }
            if (b->shelves[i][j] == 'C') {
               chars[4] += 1;
            }
            if (b->shelves[i][j] == 'Y') {
               chars[5] += 1;
            }
            if (b->shelves[i][j] == 'W') {
               chars[6] += 1;
            }
            if (b->shelves[i][j] == 'M') {
               chars[7] += 1;
            }
         } else {
            return false;
         }
      }
   }
   for (i = 0; i < 8; i++) {
      if (chars[i] > 0) {
         cnt += 1;
      }
   }
   if (cnt > b->height) {
      return false;
   }
   return true;
}
4

2 回答 2

3

声明一个字符数组或字符串文字,例如

const char *letters = "KRBGCYQM.";

然后使用标strchr头中声明的标准字符串函数,<string.h>例如

char *p = strchr( letters, b->shelves[i][j] );
if ( p != NULL ) 
{
    if ( b->shelves[i][j] != '.' ) ++chars[p - letters];
}
else
{
    return false;
}

请注意,您的代码的读者不清楚为什么'.'包含该字符,尽管它没有被计算在内。

于 2020-12-08T15:27:41.627 回答
0

我可以建议位域而不是字符数组吗?像这样的东西: -

present = 0
foreach char c in b->shelves
    if c is a uppercase letter
        present |= 1 << (c - 'A')
present &= valid letters bit pattern (this is a constant and is the or of 1 shifted by each letter)
return number of bits in present <= b->height

或者,如果您不喜欢这样,请使用开关而不是 if 测试的顺序:-

switch b->shelves[i][j]
    case 'K'
        ++chars[0]
    other cases for the valid letters
        ++chars[whatever]
    default:
        error - an invalid character
于 2020-12-08T15:43:12.993 回答