gpt4 book ai didi

c - 如何使用 fgets() 重新分配多个数组

转载 作者:行者123 更新时间:2023-11-30 19:26:44 25 4
gpt4 key购买 nike

我正在尝试使用 fgets() 读取一些输入,但我需要将输入存储在名为 userNumbers 的动态数组中,我应该如何让 realloc() 与 fgets() 一起使用?当我尝试读取超过 8 个元素(即 1,2,3,4,5,6,7,8 有效,但 1,2,3,4,5,6,7,8,9,10)时,我的程序中断才不是)。另一件事是我必须使用 fgets()。提前致谢。

size_t capacity = 4;
size_t size = 0;
char* userNumbers = (char*)malloc(capacity * sizeof(char));
char** realNumStr = (char**)malloc(capacity * sizeof(char*));
double* realNumDouble = (double*)malloc(capacity * sizeof(double));
double* realNumDoubleFinal = (double*)malloc(capacity * sizeof(double));
double* realNumDoubleMedian = (double*)malloc(capacity * sizeof(double));

if (userNumbers == NULL || realNumDouble == NULL || realNumDoubleFinal == NULL || realNumStr == NULL)
{
printf("insufficient Memory");
return EXIT_FAILURE;
}

//User's input
while (fgets(userNumbers, capacity, stream))
{
size += strlen(userNumbers);

while (size >= capacity)
{
capacity = size * 2;

char* userNumbers2 = realloc(userNumbers, capacity * sizeof(char)+1);
char** realNumStr2 = realloc(realNumStr, capacity * sizeof(char*)+1);
double* realNumDouble2 = realloc(realNumDouble, capacity * sizeof(double));
double* realNumDoubleFinal2 = realloc(realNumDoubleFinal, capacity * sizeof(double));

if (userNumbers2 == NULL || realNumDouble2 == NULL || realNumDoubleFinal2 == NULL || realNumStr2 == NULL)
{
free(userNumbers);
free(realNumDouble);
free(realNumDoubleFinal);
free(realNumStr);

printf("insufficient Memory");
return EXIT_FAILURE;
}
userNumbers = userNumbers2;
realNumStr = realNumStr2;
realNumDouble = realNumDouble2;
realNumDoubleFinal = realNumDoubleFinal2;
}

//...代码继续...}

//抛出错误:HEAP[rstats.exe]:指定给 RtlValidateHeap 的地址无效(0000026E15F20000、0000026E15F298F0)stat.exe 已触发断点。

断点在这里触发:如果(!has_cctor) _cexit();

最佳答案

您应该首先阅读所有输入。每次使用 fgets() 读取一行时,您都需要将其连接到包含所有行的缓冲区。这是您应该重新分配的缓冲区,您可以为 fgets() 调用使用固定大小的缓冲区。

char line[100];
char *numbersStr = NULL;
size_t size = 0;

while (fget(line, sizeof(line), stream) {
size_t linelen = strlen(line);
char *newNumbersStr = realloc(numbersStr, size + linelen + 1);
if (!newNumbersStr) {
free (numbersStr);
printf("insufficient Memory");
return EXIT_FAILURE;
}
numbersStr = newNumbersStr;
strcpy(&numbersStr[size], line);
size += linelen;
}

当到达stream的EOF时,该循环将结束。然后,您可以将 numbersStr 中的所有数字解析为 numbersArray,您可以在该循环中使用 realloc() 对其进行增长。

关于c - 如何使用 fgets() 重新分配多个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56695515/

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