gpt4 book ai didi

c - 自由(): invalid next size(normal)

转载 作者:行者123 更新时间:2023-11-30 15:16:18 29 4
gpt4 key购买 nike

当使用包含 200-300 个整数(以空格分隔)的输入 .txt 文件运行此代码时,我在使用 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;
}

最佳答案

您的 fscanf 循环已损坏。您实际上并没有重新分配更大的尺寸。这是更正后的程序[很抱歉进行了迂​​腐的风格重新编辑,但你击中了我的一个缺点:长侧边栏评论]

#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。还有一些小错误等待您发现。

关于c - 自由(): invalid next size(normal),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33159081/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com