【问题标题】:Quick sorting array of arrays of chars in CC中字符数组的快速排序数组
【发布时间】:2022-01-21 15:49:23
【问题描述】:

我一直在尝试在 C 中实现一种快速排序的字符数组,但它给了我一个无法调试的分段错误错误。这是代码:

int partition(char **a, int left, int right)
{
    int i, j;
    char pivot[16];
    strcpy(pivot, a[left]);
    i = left;
    j = right + 1;

    while (1)
    {
        do
            i++;
        while (i <= right && strcmp(a[i], pivot) < 0);
        do
            j--;
        while (strcmp(a[j], pivot) > 0);
        if (i >= j)
            break;
        char t[16];
        strcpy(t, a[i]);
        strcpy(a[i], a[j]);
        strcpy(a[j], t);
    }
    char t[16];
    strcpy(t, a[left]);
    strcpy(a[left], a[j]);
    strcpy(a[j], t);
    return j;
}

void quickSortChar(char **a, int left, int right)
{
    int j;
    if (left < right)
    {
        j = partition(a, left, right);
        quickSortChar(a, left, j - 1);
        quickSortChar(a, j + 1, right);
    }
}

int main()
{
    char **arr = (char **)calloc(10, sizeof(char *));
    arr[0] = (char *)malloc(16);
    arr[1] = (char *)malloc(16);
    arr[2] = (char *)malloc(16);
    arr[0] = "patata";
    arr[1] = "berenjena";
    arr[2] = "alioli";

    quickSortChar(arr, 0, 2);
}

更新 1

使用strcpy 也不起作用:

int partition(char **a, int left, int right)
{
    int i, j;
    char pivot[16];
    strcpy(pivot, a[left]);
    i = left;
    j = right + 1;

    while (1)
    {
        do
            i++;
        while (strcmp(a[i], pivot) < 0 && i <= right);
        do
            j--;
        while (strcmp(a[j], pivot) > 0);
        if (i >= j)
            break;
        char t[16];
        strcpy(t, a[i]);
        strcpy(a[i], a[j]);
        strcpy(a[j], t);
    }
    char t[16];
    strcpy(t, a[left]);
    strcpy(a[left], a[j]);
    strcpy(a[j], t);
    return j;
}

更新 2

我已经通过上移声明解决了警告。

更新 3

修复while (i &lt;= right &amp;&amp; strcmp(a[i], pivot) &lt; 0);

【问题讨论】:

  • 最近有人问,使用strcpy() 复制一个字符串。 arr[0] = "patata"; 等会覆盖您分配的指针。
  • 您还必须提供声明以满足对函数partition() 的前向引用或移动该函数。不要忽略编译器警告。
  • 我尝试过使用 strcpy,但它不起作用。我也解决了警告,但结果相同。
  • 您正在分配内存并在分配静态字符串时立即泄漏它;不需要mallocchar *arr[] = { "patata", "berenjena", "alioli" };,你当然也不需要strcpy
  • 这只是一个例子。在我的真实程序中,我有问题中描述的结构。

标签: arrays c char quicksort


【解决方案1】:

请注意,您检查 i 仅在 strcmp(a[i], pivot) &lt; 0 之后才超过 a 的长度,因此您到达 i=3 然后被转储。

改成

while (i <= right && strcmp(a[i], pivot) < 0);

我还建议使用calloc 而不是malloc 来初始化arr

【讨论】:

  • 你是对的,但这并不能解决问题:(
  • @AntonioGamizDelgado 我刚刚在我的电脑上运行了代码,没有任何错误
  • 使用calloc?还是 malloc?
  • 我正在使用 gcc -p t test.c && ./t 进行编译
  • @AntonioGamizDelgado 两者,用gcc -Wall tmp.c -o tmp编译
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-01
  • 2020-11-12
  • 1970-01-01
  • 1970-01-01
  • 2015-04-14
  • 1970-01-01
相关资源
最近更新 更多