为什么我的程序违例(段异常),怎么才能改好的
求各位大神帮我看看代码:
#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); //实现也要更改
}
}