我有以下代码
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
中的所有字符串多变的。
最佳答案
让 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
时,它会导致难以跟踪的错误。大批。
关于c - 如何遍历 char ** 指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40435398/