如何遍历char**指针?

AQU*_*AQU 2 c pointers loops

我有以下代码

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变量中的所有字符串.

Cyg*_*sX1 6

让我们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.