gpt4 book ai didi

c - 传递字符串数组 C

转载 作者:太空宇宙 更新时间:2023-11-04 02:59:18 25 4
gpt4 key购买 nike

我在函数中有以下代码

char MenuOptions[7][200];
strcpy(MenuOptions[0], "Create New / Modify Existing Customer");
strcpy(MenuOptions[1], "Create New / Modify Existing Product");
strcpy(MenuOptions[2], "List All customers");
strcpy(MenuOptions[3], "List All Products");
strcpy(MenuOptions[4], "Batch Update of New Stock");
strcpy(MenuOptions[5], "Create Customer Order");
strcpy(MenuOptions[6], "View Last Order for Customer");
switch (displayMenu("Main Menu", MenuOptions, 7, TRUE)) {
etc....

char displayMenu(char *name, char *options[], int menuLength,
enBoolean QuitEnabled) {

int i;
printf("%s: \n", name);
for (i = 0; i < menuLength; i++) {
printf("\t %d %s.\n", (i + 1), options[i]);
}
if (QuitEnabled == TRUE)
printf("\t Q. Quit\n");
etc

一旦进入 displayMenu 方法,MenuOptions 数组似乎从内存中丢失了。我尝试通过 eclipse 中的表达式窗口查看 options[i] 是什么,它说它作为一个值“超出范围”

最佳答案

首先,打开编译器中的警告选项。您的编译器应该警告您类型不匹配。

MenuOptions 是一个包含 200 个 char 的七个数组的数组。当调用 displayMenu 并将 MenuOptions 作为参数传递时,MenuOptions 会自动从数组转换为指向七个中第一个的指针200 个字符的数组。

displayMenu 中,options 参数是用 char *options[] 声明的。这意味着 options 是指向 char 的指针数组。在函数参数中,[]比较特殊;它表明将为该参数传递一个数组,但该数组实际上是通过其第一个参数的地址传递的。因此,该声明表示 options 是指向多个指向 char 的指针中第一个的指针。

因此,您传递的是指向 200 个字符的七个数组中第一个的指针,但该函数期望接收到一个指针,该指针指向一些指向 char 的指针中的第一个。

解决此问题的一种方法是将 options 的声明更改为 char (*options)[200]。这表示 options 是指向 200 个字符的数组(第一个)的指针。

修复它的更好方法可能是更改 MenuOptions:

static const char *MenuOptions[] =
{
"Create New / Modify Existing Customer",
"Create New / Modify Existing Product",
"List All customers",
"List All Products",
"Batch Update of New Stock",
"Create Customer Order",
"View Last Order for Customer",
};

(括号中不需要“7”,因为编译器会为您计算字符串数。)

那么你不需要改变options的声明,只是我添加了const:

char displayMenu(char *name, const char *options[], int menuLength,
enBoolean QuitEnabled) {…

现在:

  • MenuOptions 是一个包含七个字符串指针的数组(char 数组)。它作为指向字符串指针的指针传递,options 是指向字符串指针的指针,因此类型匹配。
  • MenuOptions 不会占用比需要更多的空间。之前,它被定义为每个字符串 200 个字符。现在,每个字符串只占用它需要的空间(在末尾加上一个空字符和一个指向 MenuOptions 数组中字符串的指针)。
  • 添加
  • const 以避免意外更改字符串。
  • MenuOptions 声明为static,因此它在编译时初始化,您不需要在运行时将字符串复制到其中。

最后,您可以将 displayMenu 调用中的“7”替换为 sizeof MenuOptions/sizeof *MenuOptions。这将数组的大小除以数组元素的大小,给出数组中元素的数量。这优于对常量进行硬编码,因为它消除了有人可能会在不更改硬编码常量的情况下更改数组大小的可能性。

关于c - 传递字符串数组 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13807505/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com