我编写了一个函数来按字母顺序对字符串进行排序,但出现分段错误

I wrote a function to sort a string in alphabetical order but getting a segmentation fault

sortswap 函数将指针作为参数,当我用 2 或 3 个字符串尝试它时它工作正常但超过三个它给出分段错误,请这是我的代码让我知道这里发生了什么以及为什么会出现此错误。

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

void get(int r, int c, char (*s)[c]);
void print(int r, int c, char (*s)[c]);
void sort(int r, int c, char (*s)[c]);
void swap(int c, char (*s)[c], char (*s1)[c]);
void main()
{
    int r;
    printf("\n\t enter no. : ");
    scanf("%d", &r);
    char s[r][31];
    get(r,31,s);
    sort(r,31,s);
    printf("\n\tsorted list");
    print(r,31,s);
}
void get(int r, int c, char (*s)[c])
{
    int i, j;
    for(i = 0; i < r; i++)
    {
        printf("\n\t");
        scanf("%s", *(s+i));
    }
}
void print(int r, int c, char (*s)[c])
{
    int i, j;
    for(i = 0; i < r; i++)
    {
        printf("\n\t%s", *(s+i));
    }
}
void sort(int r, int c, char (*s)[c])
{
    int i, j, k;
    for(i = 0; i < r; i++)
    {
        for(j = 0, k = 1; j < r-1; j++, k++)
        {
            if(strcmp(*(s+j),*(s+k)) > 0)
            {
                swap(c, (s+j), (s+k));
            }
        }
    }
}
void swap(int c, char (*s)[c], char (*s1)[c])
{
    char (*t)[c];
    strcpy(*t, *s);
    strcpy(*s,*s1);
    strcpy(*s1,*t);
}

t 是一个指针,因此需要对其进行初始化,这就是分段错误的原因,您需要分配和分配所需的内存,尽管更好的解决方案是简单地使它是一个数组:

void swap(int c, char (*s)[c], char (*s1)[c])
{
    char t[c];
    strcpy(t, *s);
    strcpy(*s,*s1);
    strcpy(*s1,t);
}

char (*t)[c] = malloc(sizeof *t); // you'll need stdlib.h

使用第二个选项,您必须释放内存:

free(t);

虽然我强烈建议第一个解决方案。

我还强烈建议在您的 get 函数中为 scanf 使用宽度限制器,否则您将面临缓冲区溢出和未定义行为的风险。

scanf("%30s", *(s+i));
// discard extra characters in case the input is larger than the destination buffer
while ((c = getchar()) != '\n' && c != EOF){}

注意 main return 类型应该是 int.

Live sample