繁体   English   中英

根据给定的顺序订购字符串

[英]Ordering no of strings according to given order

如果OrderString为“ dcfbae”,则意味着d> c> f> b> a> e,这与字典顺序(字典顺序)不同,其中a> b> c> d> e> f。 都是小写字母。

我收到SEG FAULT ..我知道它与指针有些相关,但是我无法弄清楚..这是我的代码:

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#define MAX 1001
int min(int x,int y){
    return (x>y)?y:x;
}
int check(char a,char b,char *order){
    int i,x,y;
    for(i=0;i<strlen(order);i++){
        if(a==order[i])
            x=i;
        if(b==order[i])
            y=i;
    }
if(x>y)
    return 1;
else
    return 0;
}
int compare(char *a,char *b,char *order){
   int i=0,l1=strlen(a),l2=strlen(b);
   for(i=0;i<min(l1,l2);i++){
       if(a[i]==b[i])
          continue;
       else{
           if(check(a[i],b[i],order)==1)
              return 1;
           else
              return 0;
       }
   }
}
void merge(int l,int r,int mid,char **string,char *order){
    int size1=mid-l+1;
    int size2=r-mid;
    char a[size1][MAX],b[size2][MAX];
    int i,j,k;
    for(i=0;i<size1;i++)
       strcpy(a[i],string[l+i]);
    for(i=0;i<size2;i++)
       strcpy(b[i],string[mid+1+i]);
    i=0;
    j=0;
    k=0;
    while(i<size1 && j<size2){
       if(compare(a[i],b[j],order)==0){
          strcpy(string[k],a[i]);
          i++;
       }
       else{
          strcpy(string[k],b[j]);
          j++;
       }
    k++;
   }
   while(i<size1){
      strcpy(string[k],a[i]);
      i++;
      k++;
   }
   while(j<size2){
      strcpy(string[k],b[j]);
      j++;
      k++;
   }
 }
 void mergesort(int l,int r,char **string,char *order){
      int mid=(l+r)/2;
      if(l<r){
         mergesort(l,mid,string,order);
         mergesort(mid+1,r,string,order);
         merge(l,r,mid,string,order);
      }
    return ;
 }
int main(){
    char order[MAX];
    scanf("%s",order);
    int T;
    scanf("%d",&T);
    char string[T][MAX];
    int i;
    for(i=0;i<T;i++)
        scanf("%s",string[i]);
    mergesort(0,T-1,string,order);
    for(i=0;i<T;i++)
      printf("%s\n",string[i]);
   return 0; 
  }

我正在使用mergesort算法..在此先感谢:)

您声明您的mergesort()如下:

void mergesort(int l,int r,char **string,char *order)

但是随后您按如下方式调用它:

mergesort(0,T-1,string,order);

其中string定义如下:

char string[X][Y];

因此,这是错误的:您的mergesort期望有一个指向char指针数组的指针,并且您正在将其传递给char数组。

而且,如果您的编译器没有给您错误或至少没有警告,那么这意味着您尝试在未启用最低警告的情况下开发软件,或者您在某种兼容模式下将编译器用于某些版本C。这是一个失败的原因。 因此,在修复任何问题之前,甚至在再次触摸代码之前,都要弄清楚如何在编译器上启用所有警告 ,或者如何使编译器针对最新的C标准进行编译。

要解决此问题,您可以执行@kkk建议的操作,这可能有点麻烦,因为您必须修复mergesort函数的工作方式,或者可以尝试如下声明string变量: char** string; 然后,您将不得不为其分配内存,如下所示: string = malloc( T * sizeof char* ); 然后,在读取每个字符串之前,按以下方式分配每个字符串: string[i] = malloc( (MAX + 1) * sizeof char ); 我没有C编译器,因此无法验证语法是否正确,但这应该可以帮助您入门。

如果要避免崩溃或段故障,请首先避免警告。 顺便说一下,char **和char [] []没有区别。

改变这个

void merge(int l,int r,int mid,char **string,char *order){ 

void merge(int l,int r,int mid,char string[][MAX],char *order){ 

和这个

void mergesort(int l,int r,char **string,char *order){

void mergesort(int l,int r,char string[][MAX],char *order){

现在您将进入不工作状态

我不理解您的代码,但是至少我可以给您没有错误的代码,并且您可以检查代码中的问题所在。

如果输入错误,则会因编码错误而发生。

这是代码:

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

#define MAX 1001

int min(int x,int y){
    return (x>y)?y:x;
}

int check(char a,char b,char *order){
    int i,x=0,y=0;

    for(i=0;i<(int)strlen(order);i++){
        if(a==order[i])
            x=i;
        if(b==order[i])
            y=i;
    }

    if(x>y){
        return 1;
    }else{
        return 0;
    }
}
int compare(char *a,char *b,char *order){
   int i=0,l1=(int)strlen(a),l2=(int)strlen(b);

   for(i=0;i<min(l1,l2);i++){
       if(a[i]==b[i]){
            continue;
       }else{
           if(check(a[i],b[i],order)==1){
            return 1;
           }
       }
   }

   return 0;
}

void merge(int l,int r,int mid,char string[][MAX],char *order){
    int size1=mid-l+1;
    int size2=r-mid;
    char a[size1][MAX],b[size2][MAX];
    int i,j,k;

    for(i=0;i<size1;i++){
        strcpy(a[i],string[l+i]);
    }

    for(i=0;i<size2;i++){
        strcpy(b[i],string[mid+1+i]);
    }

    i=0;
    j=0;
    k=0;

    printf("before :\n");

    for(i=0;i<size1+size2;i++)
       printf("%s\n",string[i]);
    while(i<size1 && j<size2){
       if(compare(a[i],b[j],order)==0){
          strcpy(string[k],a[i]);
          i++;
       }else{
            strcpy(string[k],b[j]);
            j++;
        }
        k++;
    }

    while(i<size1){
        strcpy(string[k],a[i]);
        i++;
        k++;
    }
    while(j<size2){
        strcpy(string[k],b[j]);
        j++;
        k++;
    }
}

 void mergesort(int l,int r,char string[][MAX],char *order){
    int mid=(l+r)/2;

    if(l<r){
        mergesort(l,mid,string,order);
        mergesort(mid+1,r,string,order);
        merge(l,r,mid,string,order);
    }
}

int main(void){
    char order[MAX];
    int t,i;

    if(scanf("%s",order) != 1){
        exit(1);
    }

    if(scanf("%d",&t) != 1){
        exit(1);
    }

    char string[t][MAX];

    for(i=0;i<t;i++)
        if(scanf("%s",string[i]) != 1){
        exit(1);
    }

    mergesort(0,t-1,string,order);
    return 0;
}

输出:

 michi@michi-laptop:~$ ./program acb 2 cab bac before : cab bac 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM