【问题标题】:C programming qsort of string - crash without compiler errorsC 编程 qsort of string - 在没有编译器错误的情况下崩溃
【发布时间】:2014-03-08 13:06:56
【问题描述】:

首先,我从 txt 中提取符号并在我放置它们的位置创建字符串“znaky”。之后,我只对字符串中的数字进行排序,然后将它们带到另一个字符串“cifry”,然后我想用 qsort 对它们进行排序,但是程序出现了一些问题。谁能帮帮我??

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

int main()
{
    const int POCET=10;
    char *znaky=(char *)malloc(POCET*sizeof(char));
    char *cifry=(char *)malloc(POCET*sizeof(char));
    char *hladaneZnaky="0123456789";
    char *nasiel;
    char znak;
    int pocetPrvkov=-1;
    int kolkoKratAlokoval=1;
    FILE *fr;

    if((fr=fopen("zdroj.txt","r"))==NULL)
    {
        printf("Subor zdroj.txt neexistuje!\n");
        return 1;
    }

    while(fscanf(fr,"%c",&znak)!=EOF)
    {
        pocetPrvkov++;
        if(pocetPrvkov%POCET==POCET-1)
        {
            kolkoKratAlokoval++;
            znaky=(char *)realloc(znaky,POCET*kolkoKratAlokoval*sizeof(char));
        }
        znaky[pocetPrvkov]=znak;
    }
    printf("%s\n\n",znaky);
    pocetPrvkov=0;
    kolkoKratAlokoval=1;
    nasiel=strpbrk(znaky,hladaneZnaky);
    while(nasiel!=NULL)
    {
        if(pocetPrvkov%POCET==POCET-1)
        {
            kolkoKratAlokoval++;
            cifry=(char *)realloc(cifry,POCET*kolkoKratAlokoval*sizeof(char));
        }
        cifry[pocetPrvkov++]=*nasiel;
        nasiel=strpbrk(++nasiel,hladaneZnaky);
    }
    cifry[pocetPrvkov]='\0';
    printf("%s\n\n",cifry);
    pocetPrvkov++;
    qsort(cifry,pocetPrvkov,sizeof(char*),comp);
    printf("%s\n",cifry);
    free(znaky);
    fclose(fr);
    return 0;
}

int comp(const void *a,const void *b)
{
    return strcmp(*(char **)a,*(char **)b);
}

【问题讨论】:

  • cifry 不是 char 指针数组,您告诉 qsort 是。

标签: c string function qsort


【解决方案1】:

cifry 的类型为 char*。所以你的比较函数应该只有:

strcmp((const char *) a, (const char *) b);

【讨论】:

    【解决方案2】:

    它应该是char **cifry(它被用作char *cifry[])。 cifry[pocetPrvkov++] 的赋值增加了一个字符,而不是一个指针,你的数据数组甚至在尝试排序之前就被破坏了。

    用适度的优化和完整的警告编译它应该可以使不匹配明显......

    定义打印数据的函数是个好习惯,在这种情况下,您应该打印出未排序的数据(至少用于调试,但让程序的用户能够检查输入可能很有用符合预期)。

    【讨论】:

      猜你喜欢
      • 2015-11-25
      • 1970-01-01
      • 1970-01-01
      • 2016-04-17
      • 2020-04-24
      • 1970-01-01
      • 1970-01-01
      • 2018-04-06
      • 2021-09-29
      相关资源
      最近更新 更多