我有以下代码
struct my_struct {
const char **enjoy;
};
const char * enjy[] = {
"Cricket", "movie", "",
"Ball", "eat", "",
};
static const struct my_struct my_struct_table[1] = {
[0] = {
.enjoy = enjy
}
};
现在我想使用那个最终结构并希望使用它进行迭代。
如何使用my_struct_table[0].enjoy
我想打印enjy
变量中的所有字符串。
答案 0 :(得分:6)
让T
为任何类型。当处理大小不同的T
数组(表示为T*
)时,您需要指定如何表示此类数组的结尾。
在更简单的情况下:对于一串字符,即T = char
,数组char*
的结尾通常由空字符\0
表示。因此,您可以将其迭代为:
char* ptr = myString;
for (char c = *ptr; c; c=*++ptr) {
...
}
您迭代所有字符,直到找到\0
的字符,使表达式c
评估为false
/ 0
并打破循环。
字符串的替代表示是将字符串的长度表示为单独的数字。例如,这是在Pascal字符串中完成的。
int size = myStringSize;
for (int idx=0; idx<size; ++idx) {
char c = myString[idx];
}
当你有一个字符串数组(即T = char*
)时,也可以使用这两种方法。您的选择是:
enjoy
数组中的特殊非字符串值存储到数组末尾的NULL
enjoy
数组的总大小存储在单独的值中。你也可以使用两个选项 - 例如,给int main(int argc, char** argv)
的参数就是这种情况。 argc
存储argv
,和 argv[argc]
中字符串值的数量,保证为NULL
。
如果您使用第一个选项,则会将其迭代为:
char** ptr = enjoy;
for (char* c = *ptr; c; c=*++ptr) {
...
}
如果您使用第二个选项:
int size = enjoySize;
for (int idx=0; idx<size; ++idx) {
char* str = enjoy[idx];
}
请注意迭代char**
的这些代码段与用于迭代简单char*
的代码段的相似性。
请注意,存储在NULL
数组中的值enjoy
与不同,而不是存储指向空字符串的指针。后者不应该用作数组末尾的标记,因为当合法的空字符串值添加到enjoy
数组时,它可能导致难以跟踪的错误。