合并字符串C中的字符排序

合并字符串C中的字符排序,c,string,sorting,merge,C,String,Sorting,Merge,我在C语言中有一个有效的合并排序算法,但它只对整数有效。当我试图将int改为char时,我得到了segfault 你能帮我一下吗,我应该在这个代码中修改什么,这样我就可以像这样使用MergeSort了: char*str = "test_string"; MergeSort(str, 0, strlen(str)-1); void合并(int*数组、int左、int中、int右){ int temparay[右-左+1]; int pos=0,lpos=left,rpos=mid+1; 而(

我在C语言中有一个有效的合并排序算法,但它只对整数有效。当我试图将int改为char时,我得到了segfault

你能帮我一下吗,我应该在这个代码中修改什么,这样我就可以像这样使用MergeSort了:

char*str = "test_string";
MergeSort(str, 0, strlen(str)-1);

void合并(int*数组、int左、int中、int右){
int temparay[右-左+1];
int pos=0,lpos=left,rpos=mid+1;

而(LPO在这两个函数中将
array
的声明从
int*
更改为
char*
。将
tempArray
设置为
char[]
而不是
int[]
。您正在尝试读取4x(或8x)的内存数组末尾超出边界,因此出现seg错误。换句话说,
char
通常是1字节,而
int
是4或8字节,因此您正在查看堆叠在一起的不同大小的项。另外,不要为字符串传递
const*
。将字符串声明为
char*str=“test\u string”
在某些系统上表示只读内存。使用
char str[]=“test\u string”如果您不严格使用C,则可以使用C++模板来为<代码> int 和<代码> char < /> >:<> /p> < p>将两个函数中的<代码> >数组<代码> >从<代码> int *>代码>改为<代码> char *>代码>这两个函数。
。您试图读取数组末尾超出边界4倍(或8倍)的内存,因此出现seg故障。换句话说,
char
是1字节(通常)当
int
为4或8时,您会看到不同大小的项目堆叠在一起。另外,不要为字符串传入
const*
。将字符串声明为
char*str=“test\u string”
意味着某些系统上的只读内存。请使用
char str[]=“test\u string”如果不是使用严格的C,可以使用C++模板来生成一个函数,用于<代码> int <代码>和<代码> char < /> >:

<代码> #包括 #包括 int Run_count=-1; int main(int argc,char*argv[]) { /*如果您不想使用argv,请自己将元素放入, 大小是字符串的数目*/ /*L-->左侧,R-->右侧*/ int i=0; int size=argc-1; 字符*A[argc-1]; 对于(i=1;i
#包括
#包括
#包括
int Run_count=-1;
int main(int argc,char*argv[])
{ 
/*如果您不想使用argv,请自己将元素放入,
大小是字符串的数目*/
/*L-->左侧,R-->右侧*/
int i=0;
int size=argc-1;
字符*A[argc-1];

对于(i=1;iHi)。要求人们发现代码中的错误并不是特别有效。您应该使用调试器(或添加打印语句)来隔离问题,方法是跟踪程序的进度,并将其与预期发生的情况进行比较。一旦这两种情况出现分歧,您就发现了问题。(然后,如果需要,您应该构造一个。)您好。要求人们发现代码中的错误并不是特别有效。您应该使用调试器(或添加打印语句)通过跟踪程序的进度,并将其与预期发生的情况进行比较,来隔离问题。一旦两者出现分歧,您就发现了问题。(如果必要,您应该构建一个解决方案。)谢谢,我尝试了这些更改,但仍然在使用StEngult。我严格使用C,所以我不能使用C++模板。我怀疑这是SeGebug发生的唯一原因。他正在通过<代码> const char */COD>字符串文字(几乎总是在只读受保护的内存中)。如果他要使用
char str[]=“MyString”,它有一个工作的机会。“Marek Teuchner没有问题!”WiNoNoTeXiToDoToo存在,把你的建议加入到答案中。谢谢你的好意。谢谢,我尝试了这些改变,但仍然在获得Sebug。我严格使用C,所以我不能使用C++模板。我怀疑这就是SeGebug发生的唯一原因。他是PAS。对试图修改字符串的函数使用
const char*
string literal(几乎总是在只读保护内存中)。如果他使用
char str[]=“MyString”
,它会有工作的机会。@Marek Teuchner没问题!@Iwillnotexistidonnotexist,将您的建议合并到答案中。感谢您的好意。包括stdio和ctype,,,还有compare函数,与字母表相比,它赋予数字更多的权重,如函数compare中所示。包括stdio和ctype,,,还有compare函数与字母表相比,e函数赋予数字更多的权重,如函数“比较”中所示
void Merge(int *array, int left, int mid, int right){

    int tempArray[right-left+1];
    int pos=0,lpos = left,rpos = mid + 1;

    while(lpos <= mid && rpos <= right){
            if(array[lpos] <= array[rpos]){
                    tempArray[pos++] = array[lpos++];
            }
            else{
                    tempArray[pos++] = array[rpos++];
            }
    }

    while(lpos <= mid)  tempArray[pos++] = array[lpos++];
    while(rpos <= right)tempArray[pos++] = array[rpos++];

    int iter;
    for(iter = 0;iter < pos; iter++){
            array[iter+left] = tempArray[iter];
    }

    return;
}

void MergeSort(int *array, int left, int right){
    int mid = (left+right)/2;

    if(left<right){
            MergeSort(array,left,mid);
            MergeSort(array,mid+1,right);
            Merge(array,left,mid,right);
    }
    return;
}
#include <stdio.h>

#include<ctype.h>

#include<string.h>

int Run_count=-1;

int main ( int argc , char *argv[] )
{ 

    /* if you dont want to use argv, put the elements in A yourself,
    size being the number of string*/

    /*L --> left side, R --> right side*/

    int i = 0;

    int size = argc-1;

    char *A[argc-1];

    for(i=1;i<=argc;i++){*(A+i-1) = argv[i];}

    Caller(A,size);

    for(i=0;i<size;i++){

        printf("%s\n", A[i]);

    }

    printf("%d",Run_count);
}

int Caller(char* A[] , int n){

    Run_count++;

    int sizeL, sizeR ,i;

    char *L[n/2+1] , *R[n-n/2+1];

    if (n < 2){return 1;}

    sizeL = n/2;
    sizeR = n - sizeL;

    for(i=0;i<sizeL;i++)  {L[i] = *(A+i);}
    for(i=0;i<n - n/2;i++)  {R[i] = *(A+i+n/2);}

    Caller( L, sizeL);
    Caller( R, sizeR);
    merger( L,sizeL, R,sizeR, A);
}

void merger(char* L[], int lengthL , char* R[] , int lengthR , char *A[]){

    int i, j, k ,t =0 ;

    for(k = 0 , j = 0; k < lengthL && j < lengthR ;t++){

        if(compare(*(L+k),*(R+j))){
            *(A+t) = *(L+k);
            k++;}

        else{*(A+t) = *(R+j);j++;}
    }

    while(k < lengthL ){
        *(A+t) = *(L+k); 
        k++;t++;
        }

    while(j < lengthR ){
        *(A+t) = *(R+j);
        j++;t++;}
}

int compare(char *line1 , char *line2 )
{
    int i;

    for(i = 0;*(line1 + i) != '\0' && *(line2 + i) != '\0' ;){
        if(isdigit(*(line1+i)) && isalpha(*(line2+i))){return 0;}

        else if(isdigit(*(line2+i)) && isalpha(*(line1+i))){return 1;}

        else if(*(line1 + i) > *(line2 + i)){return 0;}

        else if(*(line1 + i) == *(line2 + i)){i++;}

        else{return 1;}
    }
}