簡體   English   中英

初始化和訪問 static 結構實例中的二維字符數組

[英]Initialize and access 2D char array in static structure instance

對於以下表結構,我可以創建一個 static 表並打印值:

+------+---------+
| key1 |  value1 |
| key2 |  value2 |
| key3 |  value3 |
+------+---------+

#include <stdio.h>

typedef struct key_value_map
{
  char *key;
  char *value;
} KeyValueMap;

static KeyValueMap key_value_map_table[] =
{
  {"key1", "value1"},
  {"key2", "value2"},
  {"key3", "value3"},
};

int main(void) {
    int i = 0;
    int n = sizeof(key_value_map_table)/sizeof(key_value_map_table[0]);
    for(i=0; i<n; ++i)
    {
        printf("Key=%s, Val=%s\n",key_value_map_table[i].key, 
                                  key_value_map_table[i].value);
    }
    return 0;
}

但是,如果我添加多個值,則無法創建 static 表:

+------+-----------------------+
| key1 |  value1 value2 value3 |
| key2 |  value1 value4 value5 |
| key3 |  value2 value4        |
| key4 |  value5               |
+------+-----------------------+

typedef struct key_values_map
{
  char *key;
  char **values;
}KeyValuesMap;

static KeyValuesMap key_values_map_table[] =
{
  {"key1", "value1", "value2", "value3"},
  {"key2", "value1", "value4", "value5"},
  {"key3", "value2", "value4"},
  {"key3", "value5"},
};

這給我以下錯誤:

"Too many initializers"

我應該如何初始化和迭代它?

使用char*的 arrays 的復合文字。

static KeyValuesMap key_values_map_table[] =
{
  {"key1", (char*[]){"value1", "value2", "value3"}},
  {"key2", (char*[]){"value1", "value4", "value5"}},
  {"key3", (char*[]){"value2", "value4"}},
  {"key3", (char*[]){"value5"}},
};

迭代有點復雜。 我看到三種策略:

A. 使用顯式長度:

typedef struct key_values_map {
  char *key;
  size_t count;
  char **values;
}KeyValuesMap;

static KeyValuesMap key_values_map_table[] = {
  {"key1", 3, (char*[]){"value1", "value2", "value3"}},
  ...
};

B. 用NULL標記最后一個條目。

{"key1", (char*[]){"value1", "value2", "value3", NULL}},

迭代:

for (char **p = key_values_map_table[0].values; *p; ++p) {
  char *str = *p;
  ...
}

C。使用宏推斷 A 變體的大小。

#define MK_ENTRY(key, ...)                            \
  { key,                                              \
    sizeof((char*[]){ __VA_ARGS__ }) / sizeof(char*), \
    (char*[]){ __VA_ARGS__ } }

static KeyValuesMap key_values_map_table[] = {
  MK_ENTRY("key1", "value1", "value2", "value3"),
  ...
};

這個宏應用sizeof X / sizeof X[0]技巧來評估X數組的元素數量。 它本質上是將數組的大小(以字節為單位)除以其單個元素的大小(也以字節為單位)。

在這種情況下,它是sizeof((char*[]){... }) / sizeof(char*) 可變參數宏用於處理鍵后的所有宏 arguments。 基本上, __VA_ARGS__被值字符串列表所取代。

您可以為每個鍵創建一個數組以列出與該鍵關聯的值,然后在適當的地方將數組標識符包含在表初始值設定項中。

如何做到這一點的一個例子:

    const char * key1_vals[] = {"value1", "value2", "value3"};
    const char * key2_vals[] = {"value1", "value4", "value5"};
    const char * key3_vals_1[] = {"value2", "value4"};
    const char * key3_vals_2[] = {"value5"};

    static KeyValuesMap key_values_map_table[] =
    {
        {"key1", key1_vals},
        {"key2", key2_vals},
        {"key3", key3_vals_1},
        {"key3", key3_vals_1},
    };

一些事情要記住:

  1. 您將需要跟蹤與 object KeyValueMap 中每個鍵關聯的值的數量,以便程序知道要查找多少個值。
  2. 您可能想要替換char *key; char *value; const char *key; const char *value; 這樣程序就知道這些指針指向常量數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM