首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

为什么小弟我的程序违例(段错误),如何才能改好的

2013-01-23 
为什么我的程序违例(段异常),怎么才能改好的求各位大神帮我看看代码:#include stdio.h#define MAX 100vo

为什么我的程序违例(段异常),怎么才能改好的
求各位大神帮我看看代码:
#include <stdio.h>

#define MAX 100
      
void Merge(char s[],int length);
void Merge_sort(char s[],int first,int length);

int main(){
   char array[MAX];
   int  len = 0;
   int  i= 0;
       printf("please input array:\n");
        while (scanf("%c",&array[len]) != EOF)
                len ++;
       printf("transfer function:\n");
   Merge_sort(array,0,len);
   printf("the sorted array is:\n");
         while(array[i] != '\0'){
           printf("%c",array[i]);
           printf(" ");
              i ++;
           }
           printf("\n");
       system("pause");
}

void Merge(char s[],int length){
    int n1,n2;
        n1 = length/2;
        n2 = length - n1;
    int i,j,k;
    char s1[n1-1],s2[n2-1]; 
      for(i = 0;i < n1;i++)
         s1[i] = s[i];
      for(j = 0;j < n2 ;j++)
         s2[j] = s[n1+j];
    s1[i+1] = 'e';
    s2[j+1] = 'e';
    i = j = 0;
    for(k = 0;k < length;k++){
        if ((s1[i] > s2[j])&& s1[j] != 'e'){
           s[k] = s2[j];
             j++;
             }     
        else if ((s1[i] < s2[j])&& s1[i] != 'e'){    
            s[k] = s1[i];
            i++;
            }     
    }
}

void Merge_sort(char s[],int first ,int length){
     int mid;
         if (length > first){
              mid = length /2;
              Merge_sort(s,first,mid);
              Merge_sort(s,mid,length);


              Merge(s,length);  
         }
}

[解决办法]
format一下,慢慢看。。。

#include <stdio.h>

#define MAX 100
      
void Merge(char s[],int length);
void Merge_sort(char s[],int first,int length);

int main(){
char array[MAX];
int  len = 0;
int  i= 0;
printf("please input array:\n");
while (scanf("%c",&array[len]) != EOF)
len ++;
printf("transfer function:\n");
Merge_sort(array,0,len);
printf("the sorted array is:\n");
while(array[i] != '\0'){
printf("%c",array[i]);
printf(" ");
i ++;
}
printf("\n");
//system("pause");
return 0;
}

void Merge(char s[],int length){
int n1,n2;
n1 = length/2;
n2 = length - n1;
int i,j,k;
char s1[n1-1],s2[n2-1]; 
for(i = 0;i < n1;i++)
s1[i] = s[i];
for(j = 0;j < n2 ;j++)
s2[j] = s[n1+j];
s1[i+1] = 'e';
s2[j+1] = 'e';
i = j = 0;
for(k = 0;k < length;k++){
if ((s1[i] > s2[j])&& s1[j] != 'e'){
s[k] = s2[j];
j++;
}     
else if ((s1[i] < s2[j])&& s1[i] != 'e'){    
s[k] = s1[i];
i++;
}     
}
}

void Merge_sort(char s[],int first ,int length){
int mid;
if (length > first){
mid = length /2;
Merge_sort(s,first,mid);
Merge_sort(s,mid,length);
Merge(s,length);  
}
}

[解决办法]
Windows:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

Linux:
进程意外退出会在当前目录下产生形如‘core.数字’的文件比如‘core.1234’
使用命令
gdb 运行程序名 core.数字
进入gdb然后使用bt命令
可以查看进程意外退出前函数调用的堆栈,内容为从上到下列出对应从里层到外层的函数调用历史。
如果进程意外退出不产生core文件,参考“ulimit -c core文件最大块大小”命令

[解决办法]
你的归并有问题啊
比如我要排数组s:{2,1,4,3,6,5}
1.merge_sort(s,0,7)
 1.1.merge_sort(s,0,3)
   1.1.1.merge_sort(s,0,1)
     1.1.1.1.merge_sort(s,0,0)
     1.1.1.2.merge_sort(s,0,1)
红色的不就一直递归下去了?

另外一个:你的merge也有点问题,每次都是从s[0]开始,到s[length-1]
我在递归排3,6,5的时候,是不是应该从s[4]到s[6]啊?
[解决办法]

void Merge_sort(char s[],int first ,int length){//参数名字有歧义,改为start和end好些
    int mid;
    if (length > first){
        mid = length /2;//改为mid = (start+end)/2;
        Merge_sort(s,first,mid);//Merge_sort(s, start, mid);


        Merge_sort(s,mid,length);//Merge_sort(s, mid+1, end);
        Merge(s,length); //实现也要更改
    }
}

热点排行