引用 const char\* 数组

新手上路,请多包涵

我试图避免为 5 个不同的数组重复我的代码。我有 3 个数组(将来可能会更多):

 const char *FirstlistOfOptionText[2]   = {OPT_1,
                                         OPT_2};
const char *SecondlistOfOptionText[2]   = {OPT_1,
                                         OPT_2};
const char *ThirdlistOfOptionText[2]  = {OPT_1,
                                         OPT_2};

每个元素中的元素都不相同。现在它们是因为我只是复制和粘贴它们。元素的数量也不会。

我有一个函数,我想根据我作为参数给出的值打印列表的每个元素。此外,我需要以其他颜色打印其中一个元素(除了一个绿色之外,所有元素都是白色的)。

我只想像现在一样拥有一个用于打印和选择颜色的代码。但我想在这样做之前选择正确的数组。我想过:

 const char *listOfOptions[];
if(menu_t.first_level_option == 0) {
    listOfOptions = FirstlistOfOptionText;
}
if(menu_t.first_level_option == 1) {
    listOfOptions = SecondlistOfOptionText;
}
if(menu_t.first_level_option == 2) {
    listOfOptions = ThirdlistOfOptionText;
}

但是我收到一些关于“listOfOptions”存储大小的错误是未知的。或者我不能将 const char** 用于 char* 或类似的东西。

这样做的正确方法是什么?

原文由 Biribu 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 570
2 个回答

本质上,您需要将 listOfOptions 设为 char **;

可以通过指向指针的指针来引用指针数组(这就是 char ** 的含义)。

使用 listOfOptions 的任何人都将不知道大小,因此您需要一种确定大小的方法。要么使用 NULL 指针终止列表,要么您将不得不使用跟踪大小的第二个变量 (listOfOptionsSize)。

所以下面的代码应该可以编译(我选择了 NULL 终止的列表)。

 const char *FirstlistOfOptionText[]   = {"a",  "b", NULL};
const char *SecondlistOfOptionText[]   = {"c", "d", "e", "f", NULL};
const char *ThirdlistOfOptionText[]  = {"e",  "f", "g", NULL};

const char **listOfOptions= NULL;  // pointer to pointer(s)
int first_level_option= 2;         // some value for testing

if(first_level_option == 0) {
    listOfOptions = FirstlistOfOptionText;
}
if(first_level_option == 1) {
    listOfOptions = SecondlistOfOptionText;
}
if (first_level_option == 2) {
    listOfOptions = ThirdlistOfOptionText;
}

printem(listOfOptions);

现在对于您的打印函数,它将获取指向指针列表的指针作为参数,并且看起来像这样:

 void printem(const char **listOfOptions)
{
     const char *word;

     while (*listOfOptions!=NULL) {  // while the pointer in the list not NULL
        word= *listOfOptions;        // get the char * to which listOfOptions is pointing
        printf("entry: %s\n", word);
        listOfOptions++;
     }
}

哦,欢迎来到 C 指针地狱 :-)

原文由 Anachronism 发布,翻译遵循 CC BY-SA 3.0 许可协议

const char *FirstlistOfOptionText[2] 是一个由两个指向 char 的指针组成的数组。

const char *listOfOptions[] 是一个大小未知的数组,带有指向 char 的指针。

const char **listOfOptions; 是指向 char 的指针,您可以将其分配给选项数组列表的地址:

 listOfOptions = FirstlistOfOptionText;

原文由 Paul Ogilvie 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题