C:将字符串数组作为函数参数传递

Posted

技术标签:

【中文标题】C:将字符串数组作为函数参数传递【英文标题】:C : Pass Array of string as function argument 【发布时间】:2012-11-15 01:04:21 【问题描述】:

所以我有一个文件 ma​​in.c,其中包括我制作的头文件 utils.h,其中包含对源文件中函数的前向引用 utils.c

在 utils.c 中:

我有一个函数,它接受一个字符串数组作为参数,并将其作为菜单打印出来:

void showMenu(const char *menu[])

    int menulen = sizeof(menu)/sizeof(*menu);

    int i;
    for(i = 0; i < menulen; i++)
    
        printf("[%d] .. %s\n", (i+1), menu[i]);
    

在main.c中:

我只是简单地调用这个函数:

const char *menu[] =

        "Customers",
        "Orders",
        "Products"
;

int main(void)

    showTitle("Customer Orders System");
    int menulen = sizeof(menu)/sizeof(*menu);
    showMenu(menu);
    getch();

我的问题:

我的 showMenu 函数正在计算数组的长度,然后遍历它,打印字符串。当函数在 ma​​in.c 中时,这曾经可以工作,但我需要在单独的文件中组织这个项目。

现在正在计算长度为1。经过一些调试,我认为这是一个与指针相关的问题,但我似乎解决了它。 showMenu 调用后的参数是类型

const char** menu

只有原始数组的第一个元素。

我尝试推迟参数,将数组的指针传递给它,并且同时传递两者。 奇怪的是,同一行代码在 main 函数中工作。 我真的不想通过向函数添加一个数组参数长度来解决这个问题。

非常感谢任何帮助。

【问题讨论】:

+1 用于您对问题的简明描述,用于您自己的分析,以及用于实际上允许其他人重现所描述行为的格式良好的代码。 谢谢!我知道尝试回答典型的非格式化 3 行问题描述是什么感觉。而且阅读起来很无聊。 【参考方案1】:

这是因为当传递给像您这样的函数时,数组衰减为指向其第一个元素的指针,并且没有保留有关元素数量的信息。在声明数组的范围内,这种衰减没有发生,所以sizeof 有效。

您必须添加数组长度作为额外参数,或者确保数组以适当的 sentinel 值终止。一个流行的这样的值是NULL,即您确保最后一个有效索引包含一个值为NULL的字符串指针,然后表示“没有更多数据,停止”:

const char *menu[] =

    "Customers",
    "Orders",
    "Products",
    NULL /* This is a sentinel, to mark the end of the array. */
;

【讨论】:

很抱歉,但我不确定我是否理解正确。将 NULL 附加到我的数组违反了我的数组中元素的类型,正如我的编译器告诉我的那样。创建一个'char *p = NULL'并将'p'附加到我的数组会给我同样的错误。

以上是关于C:将字符串数组作为函数参数传递的主要内容,如果未能解决你的问题,请参考以下文章

C中 传递 数组 ,参数不能传递进去。

C-二维数组作为函数参数, 字符数组

如何将二维数组类型 char(字符串)作为函数参数传递?

数组名作为函数的参数属于啥传递为啥

C++ 数组与字符串⁽²³⁾|函数与数组

如何将 Swift 字符串数组传递给采用 char ** 参数的 C 函数