写入的数字少于从文件中读取的数字

Written numbers are fewer than the ones read from a file

所以,我有这个程序,它从一个文件中读取两列整数并将它们存储在一个二维数组中,然后根据第一列将该数组做短。这些数字可以出现多次。这就是为什么我需要另一个单独存储数字的原因。数字可能存在于左侧和右侧列中。问题是存储在该数组中的数字少于文件中的数字(它打印 6110 个数字,而单个数字为 7115)

文件如下所示:

1381    5026
1381    5323
1381    6347
1383    1384
1383    1389
1383    2963
1383    4179
1384    56
1384    762
1384    1049
1384    1154

代码如下所示:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int mapdoublesize(int** map,int nodes){
    int* new_array=malloc(nodes*2*sizeof(int));
    if(new_array==NULL){
        printf("Error allocating memory\n");
        abort();
    }

    for(int i=0;i<nodes;i++){
        new_array[i]=(*map)[i];
    }
    nodes*=2;
    free(*map);
    *map=new_array;
    return nodes;
}

typedef struct {
    int start;
    int end;   
} path;

int cmp(const void *a,const void *b){
    int l=((path*)a)->start;
    int r=((path*)b)->start;

    if(l>r)
        return 1;
    if(l<r)
        return -1;
    if(l==r)
        return 0;
}

int doublesize(path** array,int n){
    path* new_array=malloc(n*2*sizeof(path));
    if(new_array==NULL){
        printf("Error allocating memory\n");
        abort();
    }

    for(int i=0;i<n;i++){
        new_array[i]=(*array)[i];
    }
    free(*array);
    *array=new_array;
    n*=2;
    return n;

}


int main()
{
    int maxsize=10;
    int test;
    path* array=malloc(maxsize*sizeof(path));
    if(array==NULL) {
        printf("Error allocating memory\n");
        abort();
    }


    FILE* fd=fopen("Test.txt","r");
    if(fd==NULL) {
        printf("Error opening file\n");
        abort();
    }
    char buff[200];
    int counter=0;

    char c;
while(fgets(buff,200,fd)) {

        c=buff[0];
        if(c=='#') {
            continue;
        }
    sscanf(buff,"%d%d",&array[counter].start,&array[counter].end);
        counter++;
        if(counter==maxsize){
           maxsize=doublesize(&array,maxsize); 
    }

    }
    maxsize=counter;
    qsort(&array[0],maxsize,sizeof(path),cmp);


    counter = 0;
int nodes = 10;
int *map = malloc(nodes * sizeof(int));
if (map == NULL) {
    printf("Error allocating memory\n");
}   
int i;
for(i=0;i<maxsize;i++){
    if(map[counter-1]==array[i].start)
        continue;
        map[counter]=array[i].start;
        counter++;
        if(counter==nodes){
          nodes=mapdoublesize(&map,nodes);
        }
}
int j;
for(i=0;i<maxsize;i++){
    for(j=0;j<counter;j++){
        if(map[j]==array[i].end);
            break;
    }
    if(j!=counter)
        continue;
    map[counter]=array[i].end;
    counter++;
    if(counter==nodes)
        nodes=mapdoublesize(&map,nodes);
}

nodes=counter;
for(i=0;i<nodes;i++){
    printf("%d\n",map[i]);
}
printf("%d\n",nodes);   
    fclose(fd);
    free(array);
    return 0;
}

你在这个循环中有一个潜在的问题,你的代码的第 112 行,if 子句有一个分号,使其无用:

for(i=0; i<maxsize; i++){
    for(j=0; j<counter; j++){
        if(map[j]==array[i].end); // <-- this if has a semicolon rendering the if useless
            break;
    }
    if(j != counter)
        continue;
    map[counter]=array[i].end;
    counter++;
    if(counter==nodes)
        nodes=mapdoublesize(&map,nodes);
}

认为这可能不是唯一的问题。更正后,您的代码不会计算或存储重复的数字。