free():下一个大小无效(正常)

时间:2015-10-15 21:48:27

标签: c free qsort

当使用输入.txt文件运行此代码时,该文件包含200-300个整数(用空格分隔),我在fprintf语句的for循环之前得到一个错误。

我不确定qsort是否导致此错误或为什么会发生此错误,但我们将不胜感激。

(通过在命令行中添加输入文件的名称和输出文件来运行此文件:./ program input.txt output.txt

我的代码:

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

int cmpfunc (const void * a, const void * b)
{
   return ( *(int*)a - *(int*)b );
}

int main(int argc, char *argv[]){

    if(argc != 3){
        printf("\nInvalid input\nPlease provide the input and output text file names as %s name1 name2\n", argv[0]);
    }else{

    printf("\nPart A: \n");
    printf("..............................................................................................................\n\n");

    char *fn1 = argv[1];  //variables
    char *fn2 = argv[2]; 

    int temp = 0;
    int counter = 0;
    int index = 0;
    int index2 = 0;
    int sort = 0;


    FILE *fp1 = fopen(fn1, "r"); //read file
    FILE  *fp2 = fopen(fn2, "w"); //write file

    if(fp1 == NULL){  //test if fp1 was opened
        printf("There was an error opening the input file");
    }

     char data[10]; //ints can only hold 10 digits
     int *integerArr;
     int *tempPointer;

    integerArr = malloc(10*sizeof(int));

     int sizeOfArrs = 10;

    printf("Reading in the textfile: ");

     while(fscanf(fp1,"%s",data) != EOF){  //reads in the file breaking on each whitespace and ends at the EOF pointer

  temp = strlen(data);
  if(temp <=10){
    temp = atoi(data);
    integerArr[counter] = temp;

    printf(".");

    counter++;
    if(counter == sizeOfArrs -1){

        temp = sizeOfArrs * 2;

        tempPointer = realloc(integerArr, temp);

        if(tempPointer != NULL){
            integerArr = tempPointer;
        }

    }
  }else printf("\ninteger had too many digits\n");


    }


     printf(" Done\n%d Numbers were found\n",  counter);
     printf("The integers found in the %s file: \n", argv[1]);

        index = 0;  //reset index to 0;
    for(index;index<counter;index++){  //prints the unsorted contents of the file
        printf("%d ", integerArr[index]);
    }

    printf("\n\nPart B\n");
    printf("..............................................................................................................\n\n");


    printf("The integers found in the %s file after sorting: \n", argv[1]);

     qsort(integerArr, counter, sizeof(int), cmpfunc); //best function ever (sorts the array using the cmpfunc to tell if an integer is greater than less than or equal to the next one)

    index = 0; //resets the index
    for(index; index <counter; index++){ //prints the sorted contents of the file
        printf("%d ", integerArr[index]);

        fprintf(fp2,"%d ",integerArr[index]); //writes the sorted integers to the new file
    }

    if(fp2 == NULL){ //tests if the write worked
        printf("There was an error writing the outputfile");

    }

    printf("\n");
    close(fp1,fp2); //closes both files
    }
return 0;
}

1 个答案:

答案 0 :(得分:1)

您的fscanf循环已损坏。你并没有真正重新分配更大的尺寸。这是更正后的程序[抱歉迂腐式的reedit,但你点击了我的一个尼特:长边栏评论]

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

int
cmpfunc(const void *a, const void *b)
{
    return (*(int *) a - *(int *) b);
}

int
main(int argc, char *argv[])
{

    if (argc != 3) {
        printf("\nInvalid input\nPlease provide the input and output text file names as %s name1 name2\n", argv[0]);
        return 1;
    }

    printf("\nPart A: \n");
    printf("..............................................................................................................\n\n");

    char *fn1 = argv[1];            // variables
    char *fn2 = argv[2];

    int temp = 0;
    int counter = 0;
    int index = 0;
    int index2 = 0;
    int sort = 0;

    FILE *fp1 = fopen(fn1, "r");
    FILE *fp2 = fopen(fn2, "w");

    // test if fp1 was opened
    if (fp1 == NULL) {
        printf("There was an error opening the input file");
        return 1;
    }

    // ints can only hold 10 digits
    char data[10];
    int *integerArr;
    int *tempPointer;

    int sizeOfArrs = 10;
    integerArr = malloc(sizeOfArrs * sizeof(int));

    printf("Reading in the textfile: ");

    // reads in the file breaking on each whitespace and ends at the EOF
    // pointer
    while (fscanf(fp1, "%s", data) != EOF) {
        temp = strlen(data);
        if (temp > 10) {
            printf("\ninteger had too many digits\n");
            continue;
        }

        temp = atoi(data);
        integerArr[counter] = temp;

        printf(".");

        counter++;
        if (counter == sizeOfArrs - 1) {
            sizeOfArrs += 600;
            integerArr = realloc(integerArr, sizeOfArrs * sizeof(int));
        }
    }

    // trim array to actual size needed
    sizeOfArrs = counter;
    integerArr = realloc(integerArr, sizeOfArrs * sizeof(int));

    printf(" Done\n%d Numbers were found\n", counter);
    printf("The integers found in the %s file: \n", argv[1]);

    // prints the unsorted contents of the file
    for (index = 0; index < counter; index++) {
        printf("%d ", integerArr[index]);
    }

    printf("\n\nPart B\n");
    printf("..............................................................................................................\n\n");

    printf("The integers found in the %s file after sorting: \n", argv[1]);

    // best function ever (sorts the array using the cmpfunc to tell if an
    // integer is greater than less than or equal to the next one)
    qsort(integerArr, counter, sizeof(int), cmpfunc);

    // prints the sorted contents of the file
    for (index = 0; index < counter; index++) {
        printf("%d ", integerArr[index]);

        // writes the sorted integers to the new file
        fprintf(fp2, "%d ", integerArr[index]);
    }

    // tests if the write worked
    if (fp2 == NULL) {
        printf("There was an error writing the outputfile");

    }

    printf("\n");

    // closes both files
    fclose(fp1);
    fclose(fp2);

    return 0;
}

另外,请注意底部的fclose。还有一些小错误供你找。