我正在根据以下2个文件进行合并排序:

文件1


  federicoazurraga 11445696 31/12/1989
  fernandocardozo 14588898 12/6/1970
  lucianochavez 15478855 1992年12月25日
  juliagonzales 21458763 1974年11月24日
  francolomero 22417444 24/11/1989
  奥古斯汀城堡(Agustincastellano)24365211 30/5/1985
  martakim 26544153 1986年4月3日
  joaquinazorda 28741536 4/6/1988
  nicolasweinber 34125652 14/7/1988
  juanpardo 35459896 2/10/1994
  paulafeiman 38746369 4/4/1983
  martincurzel 38937133 1996年11月21日
  卡拉加西亚40412478 3/4/1964
  pedroquiroga 45668745 22/4/1994
  horaciofernandez 54769956 21/6/1985
  娜达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 2003年6月14日
  facundokumis 50478741 2004年5月14日
  娜达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 1992年12月25日
  juliagonzales 21458763 1974年11月24日
  francolomero 22417444 24/11/1989
  奥古斯丁城堡大街24365211 30/5/1985
  martakim 26544153 1986年4月3日
  joaquinazorda 28741536 4/6/1988
  nicolasweinber 34125652 14/7/1988
  juanpardo 35459896 2/10/1994
  paulafeiman 38746369 4/4/1983
  martincurzel 38937133 1996年11月21日
  卡拉加西亚40412478 3/4/1964
  pedroquiroga 45668745 22/4/1994
  horaciofernandez 54769956 21/6/1985

最佳答案

似乎是向nombre分配内存的问题。将nombre的大小从两个文件的最大大小增加到20,最后将NULL字符的大小增加1。根据有问题的当前数据将其更改为21,对于NULL,最大大小为20 +1。还将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

08-15 23:45