【问题标题】:Crashing when qsorting an array of pointers to strings对指向字符串的指针数组进行 qsorting 时崩溃
【发布时间】:2014-06-05 13:42:58
【问题描述】:

所以我搜索了这个论坛,然后回来阅读本章中关于使用qsort() 的每一个小细节,但我似乎无法弄清楚这一点。当我运行我的代码时,它每次都会崩溃,我尝试使用我可能找到的每一种不同的方法进行转换,但我就是无法让它停止崩溃。

char *line[MAX_WORDS] <- This is my array I am trying to sort

qsort(line, word_count, sizeof(char*), compare_words);

int compare_words(const void *p, const void *q)
{
    const char *p1 = *(char**)p;
    const char *q1 = *(char**)q;
    return strcmp(p1, q1);
}

这里是完整的源代码

//第17章编程项目#6 //第17章编程项目#5

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

    #define MAX_WORD_LEN 20
    #define MAX_WORDS 10

    int read_line(char str[], int n);
    int compare_words(const void *p, const void *q);

    int main(void)
    {
        char *line[MAX_WORDS], word_str[MAX_WORD_LEN];
        int i = 0, word_count = 0;

        for (;;) {
            printf("Enter word: ");
            read_line(word_str, MAX_WORD_LEN);
            if (strlen(word_str) == 0)
                break;

            line[i] = malloc(strlen(word_str));
            if (line[i] == NULL) {
                printf("-- No space left --\n");
                break;
            }

            strcpy(line[i], word_str);
            word_count++;
        }
        printf("Word_count: %d\n", word_count);
        qsort(line, word_count, sizeof(char*), compare_words);

        printf("\nIn sorted order:");
        for (i = 0; i <= word_count - 1; i++)
            printf(" %s", line[i]);
        putchar('\n');

        return 0;
    }

    int read_line(char str[], int n)
    {
        int ch, i = 0;

        while ((ch = getchar()) != '\n')
            if (i < n)
                str[i++] = ch;
        str[i] = '\0';
        return i;
    }

    int compare_words(const void *p, const void *q)
    {
        const char *p1 = *(char**)p;
        const char *q1 = *(char**)q;
        return strcmp(p1, q1);
    }

【问题讨论】:

  • @Jon 排序一个指向字符串的指针数组
  • 数组是否包含word_count 有效字符串?如果您遍历第一个 word_count 条目并打印它们,它是否正常工作?
  • 你确定word_count &lt;= MAX_WORDS
  • 工作正常,如图所示,给定有效的word_count 和有效的line 内容:ideone.com/qPDpqt
  • 是的,我测试了 word_count,当我输入 2 个单词时,它会打印 2

标签: c qsort


【解决方案1】:

您超出了一些缓冲区:

line[i] = malloc(strlen(word_str));
// ...
strcpy(line[i], word_str);

您需要为终止 '\0' 字符添加空格,方法是:

line[i] = malloc(strlen(word_str) + 1);
// ...
strcpy(line[i], word_str);

line[i] = strdup(word_str);
if (line[i] == NULL) {
  printf("-- No space left --\n");
  break;
}

而且你在阅读单词时永远不会增加i,所以你会在5 或其他地方有word_count,但是所有单词都暂时由line[0] 指向;其余的 (line[1]..line[4]) 未初始化。

将您的第一个 for 循环更改为:

for ( i = 0; i < MAX_WORDS; ++i ) {
  // ..
}

【讨论】:

  • XD 谢谢,我觉得自己像个白痴……问题是我没有增加 i 变量。不过,关于缓冲区,我的 word_str 已经有 '\0' 字符,所以当它为它分配空间时,我不需要 +1。感谢您的帮助XD
  • 是的,发生了什么,当输入一个空白字符串“”时,该项目调用循环结束,所以当我将 for 循环设置为无限并在我的调用下添加了一个测试read_line 函数,我取出 i 变量的增量并开始编写我的 qsort 调用......并得到了侧跟踪
  • 如果您使用的是strlen(),那么是的,当您为副本分配空间时,您确实需要+1'\0'strlen() 计算在内。
  • 啊...好的,我明白了,谢谢,我完全没有意识到这一点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-28
  • 1970-01-01
  • 2013-10-08
相关资源
最近更新 更多