gpt4 book ai didi

C:将 token 存储在不断增长的数组中

转载 作者:行者123 更新时间:2023-11-30 15:17:41 25 4
gpt4 key购买 nike

我目前正在学习 C,想要编写一个程序来读取一行数字(从文件中),用空格分隔(例如:43 2 6 120 5 23),然后将这些数字存储在动态数组中。到目前为止,我的想法是将行作为字符串读取,将其分成标记 (strtok),然后将这些标记转换为 int 数字 (atoi) 并存储它们。我的问题是我必须使用malloc分配内存,但无法告诉程序手动需要多少内存,因为它必须能够处理任何长度和数量的行尺寸,我不知道该怎么做。我应该使用realloc

我不想让任何人为我做我的工作,只是一个简单的例子和​​/或对做我想做的事情的方法的良好解释就会非常有帮助。如果需要更多信息,我会给你。我知道这里有一些关于这个主题的问题,我已经研究过它们,我只是很难理解一些事情而不解释它们,因为我对 C 编程完全陌生。当然,如果有人能给我一个可能对我有帮助的链接,那就太好了。

最佳答案

这是一个使用动态内存的非常标准的应用程序。您要做的就是为初始数量的整数声明内存,读取直到达到该数量,将数组重新分配为原来的两倍,然后继续操作,直到读取完所有数据。

虽然将整行数据读入缓冲区,然后解析缓冲区以获取所需内容通常是最佳实践,但在本例中,fscanf 是专门为处理 a 的读取和转换而定制的。单个整数值(并且它将自动消耗分隔值的空格)。

(calloc 用于下面将所有元素初始化为 0malloc 在此示例中很好,但初始化可防止意外读取在更复杂的情况下未初始化的元素)

这是一个简短的示例:

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

#define MAXI 64

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

int *array = NULL;
size_t idx = 0, max_idx = 0;
size_t arraysize = MAXI;
FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;

if (!fp) {
fprintf (stderr, "error: file open failed. '%s'\n", argc > 1 ? argv[1] : "stdin");
return 1;
}

/* allocate initial array */
array = calloc (MAXI, sizeof *array);

/* read values from file */
while (fscanf (fp, "%d", &array[idx]) == 1) {
idx++;

/* realloc if necessary */
if (idx == arraysize) {
int *tmp = realloc (array, arraysize * sizeof *array * 2);
if (!tmp) {
fprintf (stderr, "error: realloc - virtual memory exhausted.\n");
return 1;
}
array = tmp;
memset (array + arraysize, 0, arraysize); /* zero new memory */
arraysize *= 2;
}
}

/* close file */
if (fp != stdin) fclose (fp);

max_idx = idx;

/* print array */
for (idx = 0; idx < max_idx; idx++)
printf (" array[%3zu] : %d\n", idx, array[idx]);

free (array); /* free memory */

return 0;
}

示例数据

$ cat dat/100intspace.txt
27086 29317 32736 3356 12059 13921 9388 25672 19828 25390 -1190 25857 ...

输出

$ ./bin/array_dyn_read_int dat/100intspace.txt
array[ 0] : 27086
array[ 1] : 29317
array[ 2] : 32736
array[ 3] : 3356
array[ 4] : 12059
array[ 5] : 13921
array[ 6] : 9388
array[ 7] : 25672
array[ 8] : 19828
array[ 9] : 25390
array[ 10] : -1190
array[ 11] : 25857
...

验证您的内存使用情况

每当您动态分配内存时,您有责任 (1) 跟踪您分配的内容; (2) 保留一个指向起始地址的指针(以便稍后可以释放它); (3) 当不再需要内存时释放内存。 valgrind 或类似的内存错误检查器使用起来很简单,应该用来验证您的内存使用情况:

$ valgrind ./bin/array_dyn_read_int dat/100intspace.txt
==7348== Memcheck, a memory error detector
==7348== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.
==7348== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info
==7348== Command: ./bin/array_dyn_read_int dat/100intspace.txt
==7348==
array[ 0] : 27086
array[ 1] : 29317
array[ 2] : 32736
array[ 3] : 3356
array[ 4] : 12059
array[ 5] : 13921
array[ 6] : 9388
array[ 7] : 25672
array[ 8] : 19828
array[ 9] : 25390
array[ 10] : -1190
array[ 11] : 25857
....
==7348==
==7348== HEAP SUMMARY:
==7348== in use at exit: 0 bytes in 0 blocks
==7348== total heap usage: 3 allocs, 3 frees, 1,336 bytes allocated
==7348==
==7348== All heap blocks were freed -- no leaks are possible
==7348==
==7348== For counts of detected and suppressed errors, rerun with: -v
==7348== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)

如果您有任何疑问,请告诉我。

关于C:将 token 存储在不断增长的数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32123619/

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