如何遍历char **指针?

时间:2016-11-05 06:23:25

标签: c loops pointers

我有以下代码

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

1 个答案:

答案 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数组时,它可能导致难以跟踪的错误。