Closed. This question is off-topic。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。
                        
                        5个月前关闭。
                                                                                            
                
        
我正在学习在字符串数组中的合并排序。这是我的代码:

#include <stdio.h>
#include <string.h>
#define SIZE 10

int num = 0;

// Merges two subarrays of arr[].
// First subarray is arr[l..m]
// Second subarray is arr[m+1..r]

void merge(char str[SIZE][10], int l, int m, int r) {
    int i, j, k;
    int n1 = m - l + 1;
    int n2 =  r - m;

    /* create temp arrays */
    char L[n1][10], R[n2][10];

    /* Copy data to temp arrays L[] and R[] */
    for (i = 0; i < n1; i++)
        strcpy(L[i], str[l+i]);
    for (j = 0; j < n2; j++)
        strcpy(R[j], str[m+1+j]);

    /* Merge the temp arrays back into arr[l..r]*/
    i = 0; // Initial index of first subarray
    j = 0; // Initial index of second subarray
    k = l; // Initial index of merged subarray
    while (i < n1 && j < n2) {
        num++;
        switch (strcmp(L[i], R[j])) {
            case -1 :
                strcpy(str[k], L[i]);
                i++;
                break;
            case 1 :
                strcpy(str[k], R[j]);
                j++;
                break;
        }

        k++;
    }

    /* Copy the remaining elements of L[], if there
       are any */
    while (i < n1) {
        strcpy(str[k], L[i]);
        i++;
        k++;
    }

    /* Copy the remaining elements of R[], if there
       are any */
    while (j < n2) {
        strcpy(str[k], R[j]);
        j++;
        k++;
    }
}

/* l is for left index and r is right index of the
   sub-array of arr to be sorted */
void mergeSort(char str[SIZE][10], int l, int r) {
    if (l < r) {
        // Same as (l+r)/2, but avoids overflow for
        // large l and h
        int m = l+(r-l)/2;

        // Sort first and second halves
        mergeSort(str, l, m);
        mergeSort(str, m+1, r);

        merge(str, l, m, r);
    }
}

/* UTILITY FUNCTIONS */
/* Function to print an array */
void printArray(char A[SIZE][10], int size)
{
    int i;
    for (i=0; i < size; i++)
        printf("%s ", A[i]);
    printf("\n");
}

int main(void) {

    int i, n;
    char str[SIZE][10] = {"korea", "aaa", "computer", "seoul", "algorithm", "bbb", "ccc", "ddd", "game", "java"};
    char max[10];

    printf("Given array is \n");
    printArray(str, SIZE);

    mergeSort(str, 0, SIZE - 1);

    printf("\nSorted array is \n");
    printArray(str, SIZE);

    printf("횟수 : %d", num);

    return 0;
}


上面的代码运行良好。但是我想将merge(char str[SIZE][10], int l, int m, int r)mergeSort(char str[SIZE][10], int l, int r)printArray(char A[SIZE][10], int size)代码更改为使用双指针,而不是char str[SIZE][10]而是char **str。如何更改此代码?我试图这样更改,但是发生了一些错误...我必须更改merge()char L[n1][10]char R[n2][10]成员中的代码。

最佳答案

虽然数组可以衰减到指向其第一个元素的指针,但数组的数组不会衰减到指向指针的指针。

如果你有

char str[SIZE][10];


那么数组str可以衰减为指向其第一个元素的指针,该元素的类型为char (*)[10]。没有进一步的衰减发生。

这正是您的代码中已有的内容(作为参数char str[SIZE][10]被编译器视为char (*str)[10])。

如果您想要一个指向指针的指针,则要么需要从一开始就使用该类型(例如char **str;),要么使用一个将衰减为正确类型的指针数组(例如char *str[SIZE];)。

关于c - 如何在C中使用指针合并排序字符串数组? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58168821/

10-16 20:23