[英]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},
};
一些事情要記住:
char *key;
和char *value;
用const char *key;
和const char *value;
這樣程序就知道這些指針指向常量數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.