C中的字符串连接问题

时间:2013-03-28 04:32:15

标签: c++ arrays pointers multidimensional-array

这是关于C编程语言。

我有大量的2D数组(sizes are not fixed)。请考虑以下示例。

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

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

好的,现在我有了一个功能。它根据传递的参数选择其中一个2D数组。然后使用所选数组执行一些任务。请注意,任务是常见任务,只有所选数组才会更改。

例如,根据我目前的想法,是的,切换案例,我可以实现如下的功能。

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

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

任何想法都表示赞赏。

3 个答案:

答案 0 :(得分:1)

你有大量的静态数组,所以它可能是一个自然的扩展,你最终会有大量的条件来访问它们。

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

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动态分配数组,同时在运行时创建数组时关联查找代码。

答案 1 :(得分:1)

这样的事情有帮助吗? [抱歉,如果这里有一些C ++。 ]

bool** sym_a;
bool** sym_b ;
bool** sym_z;
bool** sym_0;
bool** sym_1;
bool** sym_9 ;


unsigned lowestEntry = 'a';
unsigned highestEntry = '9';
const unsigned numEntries = highestEntry - lowestEntry;

size_t size = sizeof(bool**)* numEntries;

bool*** lookup = (bool***)malloc(size); 

#define conc(a,b) a ## b
#define index(a) #a[0]-'a'
#define add(a) lookup[index(a)] = conc(sym_,a)

void init()
{
    memset(lookup, 0, size);
     add(a);
     add(b);
     add(z);
     add(9);
     add(k); // does not compile, sym_k not defined.
}

bool** findSymbolTable(char val)
{
    return lookup[val - lowestEntry];
}

答案 2 :(得分:1)

分配一个大的int数组并将其分配给其他变量。

例如

int data [2600];

对于sym_b,

将为sym_a提供前100个整数,依此类推。您将能够在这些数组中存储8 * 100 * 4个布尔值。

现在访问sym_p [x] [y]你会说你有总R行和C列:

int * start = data +(ASCIValue(p) - ASCIValue(a))* 100;

你必须从头开始读/写位号(C * x + y)。