c - 合并排序未显示 C 中的所有答案

标签 c file sorting while-loop merge

我正在对这两个文件进行合并排序:

文件 1

federicoazurraga 11445696 31/12/1989
fernandocardozo 14588898 12/6/1970
lucianochavez 15478855 25/12/1992
juliagonzales 21458763 24/11/1974
francolomero 22417444 24/11/1989
agustincastellano 24365211 30/5/1985
martakim 26544153 4/3/1986
joaquinazorda 28741536 4/6/1988
nicolasweinber 34125652 14/7/1988
juanpardo 35459896 2/10/1994
paulafeiman 38746369 4/4/1983
martincurzel 38937133 21/11/1996
carlagarcia 40412478 3/4/1964
pedroquiroga 45668745 22/4/1994
horaciofernandez 54769956 21/6/1985
nada 999999999 99/99/9999

文件2

camilaoraidea 9547698 23/4/1935
paulapomez 12445687 14/1/1956
ricardoreinas 14746966 4/5/1964
oscardias 14784411 25/12/1977
gabrielduarte 19963351 12/7/1969
hernancrespo 22045369 22/10/1988
soladmiral 22457869 31/5/1979
walterdominguez 32877999 17/2/1978
florenciahurni 33415222 22/11/1988
damianbogado 39478555 4/3/1999
kevinpolman 39789412 2/7/1997
oliverutirriaga 40412536 23/7/2000
mariagonzales 43568744 15/4/2002
ulisesiralon 48745737 14/6/2003
facundokumis 50478741 14/5/2004
nada 999999999 99/99/9999

typedef struct
{
int d;
int m;
int a;
}tfecha;


typedef struct
{
char nombre[20];
unsigned int dni;
tfecha nac;
}tperfil;

void mergesort(char archivo[], char archivo1[], FILE *file, const int h)
{
int dia, dia1, mes, mes1, ano, ano1;
unsigned int dni, dni1;
char nombre[20], nombre1[20];
tperfil buffer[1];
FILE *arch;
FILE *arch1;
printf("%s", archivo);
arch = fopen(archivo, "rt");
arch1 = fopen(archivo1, "rt");
fscanf(arch, "%s %u %i/%i/%i", &nombre, &dni, &dia, &mes, &ano);
strcpy(buffer[0].nombre, nombre);
buffer[0].dni=dni;
buffer[0].nac.d=dia;
buffer[0].nac.m=mes;
buffer[0].nac.a=ano;
fscanf(arch1, "%s %u %i/%i/%i", &nombre1, &dni1, &dia1, &mes1, &ano1);
strcpy(buffer[1].nombre, nombre1);
buffer[1].dni=dni1;
buffer[1].nac.d=dia1;
buffer[1].nac.m=mes1;
buffer[1].nac.a=ano1;
printf("%i", buffer[0].nac.d);
if(h==1)//h is always 1 in this example
{
    while((dia < 99) && (dia1 < 99))
    {
        if(buffer[0].dni < buffer[1].dni)
        {
            fprintf(file, "%s %u %i/%i/%i\n", buffer[0].nombre, buffer[0].dni, buffer[0].nac.d, buffer[0].nac.m, buffer[0].nac.a);
            fscanf(arch, "%s %u %i/%i/%i", &nombre, &dni, &dia, &mes, &ano);
            strcpy(buffer[0].nombre, nombre);
            buffer[0].dni=dni;
            buffer[0].nac.d=dia;
            buffer[0].nac.m=mes;
            buffer[0].nac.a=ano;
        }
        else
        {
            fprintf(file, "%s %u %i/%i/%i\n", buffer[1].nombre, buffer[1].dni, buffer[1].nac.d, buffer[1].nac.m, buffer[1].nac.a);
            fscanf(arch1, "%s %u %i/%i/%i", &nombre1, &dni1, &dia1, &mes1, &ano1);
            strcpy(buffer[1].nombre, nombre1);
            buffer[1].dni=dni1;
            buffer[1].nac.d=dia1;
            buffer[1].nac.m=mes1;
            buffer[1].nac.a=ano1;
        }
    }
}
}

问题是它正确打印了名字,但随后它只是复制所有 FILE 1,甚至没有检查 FILE 2,如下所示:

camilaoraidea 9547698 23/4/1935
federicoazurraga 11445696 31/12/1989
fernandocardozo 14588898 12/6/1970
lucianochavez 15478855 25/12/1992
juliagonzales 21458763 24/11/1974
francolomero 22417444 24/11/1989
agustincastellano 24365211 30/5/1985
martakim 26544153 4/3/1986
joaquinazorda 28741536 4/6/1988
nicolasweinber 34125652 14/7/1988
juanpardo 35459896 2/10/1994
paulafeiman 38746369 4/4/1983
martincurzel 38937133 21/11/1996
carlagarcia 40412478 3/4/1964
pedroquiroga 45668745 22/4/1994
horaciofernandez 54769956 21/6/1985

最佳答案

这似乎是内存分配给nombre的问题。将 nombre 的大小从 20 增加到两个文件中可能存在的最大大小 + 1(结尾为 NULL 字符)。根据当前相关数据将其更改为 21,最大大小为 20 + 1(对于 NULL)。同时将 tperfil buffer[1] 更改为 tperfil buffer[2]

我得到的输出为:

camilaoraidea 9547698 23/4/1935
federicoazurraga 11445696 31/12/1989
paulapomez 12445687 14/1/1956
fernandocardozo 14588898 12/6/1970
ricardoreinas 14746966 4/5/1964
oscardias 14784411 25/12/1977
lucianochavez 15478855 25/12/1992
gabrielduarte 19963351 12/7/1969
juliagonzales 21458763 24/11/1974
hernancrespo 22045369 22/10/1988
francolomero 22417444 24/11/1989
soladmiral 22457869 31/5/1979
agustincastellano 24365211 30/5/1985
martakim 26544153 4/3/1986
joaquinazorda 28741536 4/6/1988
walterdominguez 32877999 17/2/1978
florenciahurni 33415222 22/11/1988
nicolasweinber 34125652 14/7/1988
juanpardo 35459896 2/10/1994
paulafeiman 38746369 4/4/1983
martincurzel 38937133 21/11/1996
damianbogado 39478555 4/3/1999
kevinpolman 39789412 2/7/1997
carlagarcia 40412478 3/4/1964
oliverutirriaga 40412536 23/7/2000
mariagonzales 43568744 15/4/2002
pedroquiroga 45668745 22/4/1994
ulisesiralon 48745737 14/6/2003
facundokumis 50478741 14/5/2004

关于c - 合并排序未显示 C 中的所有答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41561155/

相关文章:

Python 3.3.2 tkinter ttk TreeView 每列排序仅按最后一列排序?

c - 数据读取性能优化

c - 在不按 "enter"的情况下获取 c 中的字符

c - 这个make文件有什么问题?

file - sox合并两个不同长度的文件

delphi - 向 TList 和 TStringList 添加稳定排序的简单方法

android - libuv(node.js's async lib) 可以在Apple IOS/Android 上运行吗?

以字节为单位的 Java NegativeArraySizeException

file - scala中的图像文件和相对路径

scala - 按位置对 ListBuffer 进行排序