c - 如何遍历 char ** 指针?

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

最佳答案

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/

    相关文章:

    将 * 指针转换为 *** 指针

    objective-c - 星号 * 在 Objective-C 中是什么意思?

    c - gcc 优化掉复合语句

    c - 函数参数的赋值在函数外没有影响

    运算符的 C99 关联性 - 它在哪里指定?

    javascript - 带 if 语句循环的空数组

    Javascript::循环直到readyState完成

    C编程: Division in an if-statement

    c++ - 从选择的语句中删除选择

    c++ - 函数应该返回指向派生类还是基类的指针?