【问题标题】:How to iterate through a char ** pointer?如何遍历 char ** 指针?
【发布时间】:2017-03-19 00:55:38
【问题描述】:

我有以下代码

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

【问题讨论】:

  • 你需要添加一种知道列表末尾在哪里的方法
  • 危险:我相信.enjoy = enjy; 只适用于C。在C++ 中你应该使用构造函数,或者像这样的简单情况Aggregate Initialization
  • [0] = { .enjoy = enjy } 在 C++ 中有效吗?看起来像是混合了 VB 的东西。
  • 嗯,它对我来说很好用。我正在使用 linux 和 g++
  • 包含 C 标头不会使其成为有效的 C++。我将它重新标记为 C,因为它 C,而不是 C++。

标签: c loops pointers


【解决方案1】:

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 数组的总大小存储在一个单独的值中。

您也可以使用 both 选项——例如,给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** 的 sn-ps 与那些用于迭代简单 char* 的 sn-ps 的相似之处。

请注意,存储在enjoy 数组中的值NULL 与存储指向空字符串的指针不同。后者不应用作数组结尾的标记,因为当将合法的空字符串值添加到 enjoy 数组时,它可能会导致难以跟踪的错误。

【讨论】:

  • 我只能访问 my_struct_table[0].enjoy 这是 char ** 。我知道大小。 my_struct_table[0].enjoy[idx] 不工作
  • 如果您知道大小,请使用第二种方法。 my_struct_table[0].enjoy[idx] 应该可以正常工作,除非您没有告诉我们。也许在您的问题中写下您如何尝试迭代,以便我们发现问题。
  • 我分享了所有内容,我收到此错误read.cpp:23:46: error: invalid conversion from ‘const char*’ to ‘char*’ [-fpermissive] char* str = my_struct_table[0].enjoy[idx];
  • @AQU:然后把char* str ...改成const char* str ...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-30
  • 2016-11-12
  • 2013-03-22
  • 1970-01-01
  • 2015-08-12
  • 1970-01-01
相关资源
最近更新 更多