将字符串数组作为函数中的输入参数传递

Passing array of strings as an input argument in a function

我是 C 的新手,我不确定问题的标题是否与我在这里要问的内容相符。基本上我已经写了一些代码来:

  1. 每次要求用户输入一个字符串,并填满字符串数组。
  2. 按字母顺序对字符串数组进行排序。
    char ch_arr[nV][MAX_WORD_LENGTH];
    for (int i = 0; i < nV; i++) {
        printf("Enter a word: ");
        scanf(FORMAT_STRING, ch_arr[i]);
    }

    //sort array of string alphabetically
    char temp[MAX_WORD_LENGTH];
    for (int i = 0; i < nV; i++) {
        for (int j = i+1; j < nV; j++) {
            if (strcmp(ch_arr[i], ch_arr[j]) > 0) {
                for (int c = 0; c < MAX_WORD_LENGTH; c++) {
                    temp[c] = ch_arr[i][c]; 
                    ch_arr[i][c] = ch_arr[j][c]; 
                    ch_arr[j][c] = temp[c]; 
                }
            }
        }
    }

现在我想让排序部分成为一个单独的函数以实现可重用性。我读过的例子都是使用双指针指向一个字符,但我不太确定如何在这里应用它?

非常感谢您的阅读。非常感谢任何帮助!

在 C 中有两种分配字符串数组的方法。

  • 作为具有固定字符串长度的真正二维数组 - 这就是您当前拥有的。 char strings [x][y];.
  • 或者作为指向字符串的指针数组。 char* strings[x]。与二维数组版本不同,可以通过 char** 访问此指针数组中的一项。

2D 数组版本的优点是访问速度更快,但这意味着您受困于 pre-allocated 固定大小。指针 table 版本通常较慢,但允许为每个字符串单独分配内存。

认识到这两种形式彼此不直接兼容很重要。如果你想声明一个以这些作为参数的函数,它通常是:

void func (size_t x, size_t y, char strings[x][y]); // accepts 2D array
void func (size_t x, size_t y, char (*strings)[y]); // equivalent, accepts 2D array

void func (size_t x, char* strings[x]); // accepts pointer array
void func (size_t x, char** strings);   // equivalent - accepts pointer array