c++ - C 中的字符串连接问题

标签 c++ arrays pointers multidimensional-array

这是关于C编程语言。

我有大量的二维数组(大小不固定)。考虑以下示例。

bool sym_a[][]={{...},{...},...};  //consider these are initialized properly
bool sym_b[][]={{...},{...},...};
...
bool sym_z[][]={{...},{...},...};
bool sym_0[][]={{...},{...},...};
bool sym_1[][]={{...},{...},...};
...
bool sym_9[][]={{...},{...},...};
...

请注意命名约定,所有名称都是相似的。只有数组名称的最后一个字符发生变化(如果它可以是多个字符更好,但这并不重要)。

好吧,现在我有了一个函数。它根据传递的参数选择这些二维数组之一。然后对选定的阵列执行一些任务。请注意,该任务是一项常见任务,仅更改选定的数组。

比如,根据我目前能想到的,是的,switch-case,我可以实现如下功能。

void doStuff(char letter){
    switch(letter){
        case 'a':
            sym_a[0][0]=1;  //just for demonstration :D
        break;
        case 'b':
            sym_b[0][0]=1;  //same thing, only the character 'a' changed to 'b'
        break;
        ...
        case 'z':
            sym_z[0][0]=1;
        break;
        case '0':
            sym_0[0][0]=1;
        break;
        case '1':
            sym_1[0][0]=1;
        break;
        ...
        ...
    }    
}

但一定有更好的方法。如果我有1000个这样的数组,那么我是否必须写1000个这样的情况?对于所有情况,内容都是完全相同的。变量名中只有一个字符会发生变化。

如果有字符串连接之类的东西就好了。

#define conc(a,b) a ## b

然后conc(sym_,a)将代表sym_a。但这不能直接应用在这里。因为我无法将确切的字母传递给 conc(a,b) 的右侧参数,所以只能传递包含所需字母的变量。

void doStuff(char letter){
    conc(sym_,letter)[0][0]=1;
}

conc(sym_,letter) 给出 sym_letter。但我需要将 sym_ 与字符变量 letter 的内容连接起来。

例如,如果我调用 doStuff('b');,则应给出 sym_b,而不是 sym_letter

希望我的要求清楚。这件事看起来很简单,但我想不出办法摆脱它。请注意,二维数组的大小(行数/列数)不固定。否则我可以使用 3D 数组。

任何想法都值得赞赏。

最佳答案

您有大量的静态数组,因此您最终可能会使用大量的条件来访问它们,这可能是一个自然的扩展。

您可以定义一个额外的静态数组,将字符代码映射到数组。

static const struct {
  char* lookup_code;
  bool **array;
} char_code_lookup[] = {
    { .lookup_code = "a", sym_a },
    { .lookup_code = "b", sym_b },
    /* ... */
    { .lookup_code = NULL, NULL }, /* Terminator */
};

然后,您的 doStuff 函数可以扫描数组,查找适当的查找代码以与静态定义的数组匹配。

通过一些宏魔法,您可以同时生成静态数组和静态查找数组以减少重复,但上面列出的方法可能更容易阅读。

或者,您可以使用 malloc 动态分配数组,同时在运行时创建数组时关联查找代码。

关于c++ - C 中的字符串连接问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15674325/

相关文章:

c++ - 为什么我的if else语句不起作用并从数组中输出正确的索引?

c++ - 如何创建辅助数据结构以在minheap中跟踪堆索引以进行C++中的reduce_key操作

c++ - vector c++ 的奇怪行为

c - 将 csv 文件读入结构数组

C++ ExportAsFixedFormat 保存为 PDF

c++ - 如何设置与背景图片大小相对应的窗口大小?

python - 在 numpy 中,将 3 维数组的第二维乘以 1 维数组的最快方法是什么?

c++ - 判断 std::vector 是否已重新放置其数组的最佳方法是什么?

C++ 释放的指针未分配。不免费打电话

c++ - 将堆分配的引用分配给堆栈分配的变量