根据给定顺序订购字符串数
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;
}
我正在使用合并排序算法..
提前致谢:)
如果目的是避免崩溃或段错误,请首先避免警告。
顺便说一下 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){
现在您将运行进入不工作状态
您声明您的 mergesort()
如下:
void mergesort(int l,int r,char **string,char *order)
但是你调用它如下:
mergesort(0,T-1,string,order);
其中string
定义如下:
char string[X][Y];
所以,这是错误的:您的合并排序需要一个指向 char 指针数组的指针,而您传递给它的是一个 char 数组。
如果你的编译器没有给你一个错误,或者至少没有警告,那么这意味着你正在尝试开发软件而没有启用最低限度的警告,或者你正在使用您的编译器在某些 旧石器时代 版本的 C 中处于某种兼容模式。这是一个失败的原因。因此,在修复任何问题之前,甚至在再次接触您的代码之前,请弄清楚如何在您的编译器上启用所有警告,或者如何让您的编译器为最新的 C 标准编译。
要解决此问题,您可以按照@kkk 的建议进行操作,这可能有点麻烦,因为您必须修复合并排序函数的工作方式,或者您可以尝试声明您的 string
变量如下: char** string;
然后,你必须为它分配内存,像这样: string = malloc( T * sizeof char* );
然后,在读取每个字符串之前,像这样分配每个字符串: string[i] = malloc( (MAX + 1) * sizeof char );
我手边没有 C 编译器,所以我无法验证我的语法是否完全正确,但这应该可以帮助您入门。
嗯,我不明白你的代码,但至少我可以给你一个没有错误的代码,你可以检查代码中的问题所在。
如果您回答错误,那是因为您编码错误。
代码如下:
#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
如果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;
}
我正在使用合并排序算法.. 提前致谢:)
如果目的是避免崩溃或段错误,请首先避免警告。 顺便说一下 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){
现在您将运行进入不工作状态
您声明您的 mergesort()
如下:
void mergesort(int l,int r,char **string,char *order)
但是你调用它如下:
mergesort(0,T-1,string,order);
其中string
定义如下:
char string[X][Y];
所以,这是错误的:您的合并排序需要一个指向 char 指针数组的指针,而您传递给它的是一个 char 数组。
如果你的编译器没有给你一个错误,或者至少没有警告,那么这意味着你正在尝试开发软件而没有启用最低限度的警告,或者你正在使用您的编译器在某些 旧石器时代 版本的 C 中处于某种兼容模式。这是一个失败的原因。因此,在修复任何问题之前,甚至在再次接触您的代码之前,请弄清楚如何在您的编译器上启用所有警告,或者如何让您的编译器为最新的 C 标准编译。
要解决此问题,您可以按照@kkk 的建议进行操作,这可能有点麻烦,因为您必须修复合并排序函数的工作方式,或者您可以尝试声明您的 string
变量如下: char** string;
然后,你必须为它分配内存,像这样: string = malloc( T * sizeof char* );
然后,在读取每个字符串之前,像这样分配每个字符串: string[i] = malloc( (MAX + 1) * sizeof char );
我手边没有 C 编译器,所以我无法验证我的语法是否完全正确,但这应该可以帮助您入门。
嗯,我不明白你的代码,但至少我可以给你一个没有错误的代码,你可以检查代码中的问题所在。
如果您回答错误,那是因为您编码错误。
代码如下:
#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