我有以下代码
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
}
};
Run Code Online (Sandbox Code Playgroud)
现在我想使用那个最终结构,并希望使用它进行迭代.我该如何迭代使用my_struct_table[0].enjoy
我想打印enjy
变量中的所有字符串.
让我们T
成为任何类型.当处理T
不同大小的数组(表示为)时T*
,您需要指定如何表示此类数组的结尾.
在更简单的情况下:对于一串字符,即T = char
数组的末尾char*
通常由空字符表示\0
.因此,您可以将其迭代为:
char* ptr = myString;
for (char c = *ptr; c; c=*++ptr) {
...
}
Run Code Online (Sandbox Code Playgroud)
迭代所有字符,直到到达那个字符,\0
使表达式c
求值为false
/ 0
并打破循环.
字符串的替代表示是将字符串的长度表示为单独的数字.例如,这在Pascal字符串中完成.
int size = myStringSize;
for (int idx=0; idx<size; ++idx) {
char c = myString[idx];
}
Run Code Online (Sandbox Code Playgroud)
当你有一个字符串数组(即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) {
...
}
Run Code Online (Sandbox Code Playgroud)
如果您使用第二个选项:
int size = enjoySize;
for (int idx=0; idx<size; ++idx) {
char* str = enjoy[idx];
}
Run Code Online (Sandbox Code Playgroud)
请注意这些片段的迭代性char**
与用于迭代简单的片段的相似性char*
.
请注意,NULL
存储在enjoy
数组中的值与存储指向空字符串的指针不同.后者不应该用作数组末尾的标记,因为当合法的空字符串值添加到数组时,它可能导致难以跟踪的错误enjoy
.