我想制作'合并排序'计划。 当我开始它时,“arr.txt”和“brr.txt”只是数据而“result.txt”是合并排序的结果(arr.txt + brr.txt)。
#include<stdio.h>
#include<stdlib.h>
void merge_sort(int num)
{
FILE *fp1,*fp2,*fp3; // fp1 is arr.txt, fp2 is brr.txt, and fp3 is result.txt
int i, j, point_one=0, point_two=0;
char a[num], b[num], c[num];
fp1=fopen("arr.txt","r");
fp2=fopen("brr.txt","r");
fp3=fopen("result.txt","w");
fscanf(fp1, "%s", a);
fscanf(fp2, "%s", b);
for(i=0;i<num;i++)
{
if(a[point_one]>b[point_two])
{
fprintf(fp3, b[point_two]);
point_two++;
}
else
{
fprintf(fp3, a[point_one]);
point_one++;
}
}
fclose(fp1);
fclose(fp2);
fclose(fp3);
}
int main(void)
{
FILE *fp_one,*fp_two;
char *arr;
char *brr;
int num;
fp_one=fopen("arr.txt","w");
fp_two=fopen("brr.txt","w");
printf("input array size :");
scanf("%d", &num);
arr=(char*)malloc(sizeof(char)*num);
brr=(char*)malloc(sizeof(char)*num);
printf("input arr :" );
scanf("%s", arr);
printf("input brr :");
scanf("%s", brr);
fprintf(fp_one, arr);
fprintf(fp_two, brr);
merge_sort(num);
fclose(fp_one);
fclose(fp_two);
free(arr);
free(brr);
return 0;
}
但是,在这段代码中,我无法进行排序。请帮帮我
++ 如果数组大小为5,则arr.txt的内容为“acfj”,而brr.txt的内容为“bdgh”, result.txt的内容是“abcdfgh”
答案 0 :(得分:1)
你有两个问题。首先是你不能正确打印字母。 fprintf
函数需要第二个参数为字符串,但是传递单个字符。编译器应该向你尖叫警告。你永远不应该忽视警告,因为它们通常是未定义行为的指标。
使用例如fputc
或使用正确的格式字符串打印字符。
第二个问题是,你没有足够的时间循环来完成排序/合并,也不会检查任何一个输入的结束。
答案 1 :(得分:0)
在致电fp_one
之前,您应关闭fp_two
和merge_sort()
。否则,之前的输出可能还没有被刷新到文件中。
根据您的测试输入,您尝试将5个字符存储到3元素字符数组中(不要忘记终止字符串的'\0'
字符)。这会导致缓冲区溢出,从而导致不确定的行为。
另一个问题:在merge_sort()
中,当point_one
或point_two
到达字符串的结尾时,下一个比较总是选择'\0'
,它小于所有其他字符
答案 2 :(得分:0)
在主体上 改为
fprintf(fp_one, "%s", arr);//to prevent malfunction when '%' is included
fprintf(fp_two, "%s", brr);
fclose(fp_one);//to determine the output of the file.
fclose(fp_two);//Also Close to open the file in the merge_sort function.
merge_sort(num);
merge_sort
更改为
void merge_sort(int num){
FILE *fp1,*fp2,*fp3;
int point_one=0, point_two=0;
char a[num], b[num];
fp1=fopen("arr.txt","r");
fp2=fopen("brr.txt","r");
fp3=fopen("result.txt","w");
fscanf(fp1, "%s", a);
fscanf(fp2, "%s", b);
fclose(fp1);
fclose(fp2);
while(a[point_one] && b[point_two]){//Data of both is valid
if(a[point_one]>b[point_two]){
fprintf(fp3, "%c", b[point_two++]);
} else {
fprintf(fp3, "%c", a[point_one++]);
}
}
if(a[point_one]){//There is a rest.
fprintf(fp3, "%s", &a[point_one]);
}
if(b[point_two]){
fprintf(fp3, "%s", &b[point_two]);
}
fclose(fp3);
}