写入的数字少于从文件中读取的数字
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);
}
认为这可能不是唯一的问题。更正后,您的代码不会计算或存储重复的数字。
所以,我有这个程序,它从一个文件中读取两列整数并将它们存储在一个二维数组中,然后根据第一列将该数组做短。这些数字可以出现多次。这就是为什么我需要另一个单独存储数字的原因。数字可能存在于左侧和右侧列中。问题是存储在该数组中的数字少于文件中的数字(它打印 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);
}
认为这可能不是唯一的问题。更正后,您的代码不会计算或存储重复的数字。