将字符串数组传递给函数C

11

目前我对如何将字符串数组传递给函数感到困惑。我已经创建了一个一维数组。我用的方法虽然可行,但似乎有些冗余,我认为有更好的方法,但我不确定怎么做。我试图找到一种方法,可以一次性将所有4个元素传递给函数。

以下是我的代码示例:

#include <stdio.h>
#include <string.h>
#include <ctype.h>

void sort(char *,char *,char *, char *);//Function prototype
int main()
{
    char *string_database[4]={'\0'};
    string_database[0]="Florida";
    string_database[1]="Oregon";
    string_database[2]="California";
    string_database[3]="Georgia";
    sort(string_database[0],string_database[1],string_database[2],string_database[3]);
    return 0;
}

void sort(char *string1, char *string2, char *string3, char *string4)
{

    printf("The string is= %s\n",string1);
    printf("The string is= %s\n",string2);
    printf("The string is= %s\n",string3);
    printf("The string is= %s\n\n\n",string4);

}

提前感谢,我非常感激对我的问题做出任何回复。


@Eregrith 这不是一个多维数组,而是一个一维指针数组。 - Lundin
3个回答

17
您可以像这样做:
void sort(char **, int);
int main()
{
    char *string_database[5]={'\0'};
    string_database[0]="Florida";
    string_database[1]="Oregon";
    string_database[2]="California";
    string_database[3]="Georgia";

    sort(string_database, 4);
    return 0;
}

void sort(char **str, int n)
{
    int i = 0;
    for (i = 0; i < n; i++)
      printf("The string is= %s\n",str[i]);

}

4
请在sort函数中添加一个长度参数(因为你不能在sort()函数中使用sizeof(str))。 - Jite
2
答案应该对那些有同样疑问的人有用,正确地做好这件事应该是一个高优先级的任务,或者至少解释一下可能会遇到的问题等。 - Jite

5
#include <stdio.h>
#include <string.h>
#include <ctype.h>

void sort(char *strings[], int n);//Function prototype
int main()
{
    char *string_database[4]={'\0'};
    string_database[0]="Florida";
    string_database[1]="Oregon";
    string_database[2]="California";
    string_database[3]="Georgia";
    sort(string_database, 4);
    return 0;
}

void sort(char *strings[], int n)
{
    int i;
    for (i=0; i<n; i++) {
        printf("String %d: %s\n", i, strings[i]);
    }
}

通常情况下,您需要将数组长度与数组本身一起传递。但是,char *strings[]实际上只是一种语法糖,因此如果您想保留函数原型而不使用参数名称,则也可以使用char **strings,这样代码就可以像下面这样:

#include <stdio.h>
#include <string.h>
#include <ctype.h>

void sort(char **, int);//Function prototype
int main()
{
    char *string_database[4]={'\0'};
    string_database[0]="Florida";
    string_database[1]="Oregon";
    string_database[2]="California";
    string_database[3]="Georgia";
    sort(string_database, 4);
    return 0;
}

void sort(char **strings, int n)
{
    int i;
    for (i=0; i<n; i++) {
        printf("String %d: %s\n", i, strings[i]);
    }
}

此外,正如下面Jite所指出的那样,使用char *strings[]这样的语法可能会让您或其他代码读者误以为他们正在处理静态矩阵,而事实并非如此;因此,您应该选择更直接的char **strings语法。

我甚至会说,使用*strings[]作为函数参数是不好的实践。在我看来,很容易错误地对其执行sizeof操作(这是无效的)。 - Jite
@Jite 默认的 main() 函数使用 *argv[]。程序员需要正确使用 sizeof - Eric
@Glaedr 我不明白在定义和调用函数 char ** strings 时使用两个间接运算符的意义。如果只使用一个间接运算符,程序将无法正常工作。 - Max twelve
strings 是一个指向指针的指针,对于 C 语言中的数组而言,它们被实现为指向第一个元素的指针。当你将它们传递给函数时,作为参数传递的是指针。strings 应该接收主程序中指向字符指针的数组,因此它必须是指向第一个元素的指针:一个指向指针的指针。 - Michele De Pascalis

0

在阅读了所有给出的答案后,我想告诉你一件事。你还可以逐个字符地打印你的字符串。

void sort(char **, int);
int main()
{
    char *string_database[5]={'\0'};
    string_database[0]="Florida";
    string_database[1]="Oregon";
    string_database[2]="California";
    string_database[3]="Georgia";

    sort(string_database, 4);
    return 0;
}

void sort(char **str, int n)
{
    int i = 0;
    for (i = 0; i < n; i++)
    {
       for (int j=0;str[i][j]!='\0';j++)
       {
          printf("%c",str[i][j]);
       }
       printf("\n");
    }
}

由于str是双指针,我们可以毫无问题地使用两个下标来获取字符。


当然可以,不用说了。在C语言中,字符串是字符数组。字符串数组是二维字符数组。因此,您可以使用双下标来获取矩阵中位置的值。 - user3091673

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接