C : Pass Array of string as function argument

标签 c arrays string function arguments

所以我有一个文件 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

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

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

非常感谢任何帮助。

最佳答案

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

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

const char *menu[] =
{
    "Customers",
    "Orders",
    "Products",
    NULL /* This is a sentinel, to mark the end of the array. */
};

关于C : Pass Array of string as function argument,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13583736/

相关文章:

c - 忽略 2 个字符之间的字符

c++ - 如何以编程方式迭代所有 CMake 目标?

c - 从 NetBeans 启动 C 应用程序时重定向标准输入

java - 创建列表数组

c++ - 简单字符串代码中没有匹配 'operator=='

c - 这个位排序代码中的位操作是如何工作的?

arrays - 在 ./parse_rss.pl 第 27 行的字符串 eq 中使用未初始化的值

javascript排序二维数组在我的数组中重复

c - 如何在我的 C 字符串前面插入单个字符?

java - 检查字符串是否在字符串的 ArrayList 中