传递一系列字符串C

时间:2012-12-10 19:08:55

标签: c arrays string pointers

我在函数中有以下代码

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中的表达式窗口看到了哪些选项[i],它说它是“超出界限”作为值

4 个答案:

答案 0 :(得分:1)

optionsdisplayMenu的类型必须为char (*options)[200]。不是char *options[]

除非它是sizeof的操作数。 _Alignof或一元&运算符,或者是一个字符串文字用于初始化声明中的数组,表达式类型为“{元素数组{{1 “将被转换(”衰减“)到”指向T的指针“类型的表达式。在这种情况下,T是由MenuOptions的200个元素数组组成的7元素数组;根据上面的规则,它将衰减为“指向char的200个元素数组的类型”的表达式。

如上所述,char的类型为options; char **为您提供options[i]指向数组基础后i的指针,而不是char' 200元素数组i } 的。

答案 1 :(得分:1)

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

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

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

所以,你传递一个指向七个200 char数组中第一个的指针,但是该函数希望得到指向char的一些指针中的第一个指针。

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

更好的解决方法可能是更改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替换sizeof MenuOptions / sizeof *MenuOptions来电中的“7”。这将数组的大小除以数组元素的大小,给出数组中元素的数量。这比硬编码常数更受欢迎,因为它消除了某人可能在不改变硬编码常数的情况下改变数组大小的可能性。

答案 2 :(得分:0)

一个选项:

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

答案 3 :(得分:0)

更改输入类型:

char displayMenu(char *name, char *options[], ...

反映它是一个多维数组:

char displayMenu(char *name, char options[][200], ...

其他可行的选项:

char displayMenu(char *name, char options[7][200], ...

char displayMenu(char *name, char (*options)[200], ...

重点是当传递多维数组时,所有维度都超过第一个,也需要传递。

相关问题