我是C的新手,只是了解malloc和realloc,并帮助社区了解如何做到这一点。我有一个带有段落的文件,我需要逐行读取并将行存储在数组o字符串中,同时动态创建数组。
如果这还不够,那么要存储的MAX行数是10,我们使用realloc将内存加倍并打印一条消息,指示我们重新分配了内存。到目前为止,这是我所拥有的,需要帮助才能完成
int main(int argc, char* argv[])
{
char* p = malloc(10* sizeof(char));
while(buffer, sizeof(buffer), stdin)
{
}
}
答案 0 :(得分:0)
while(buffer, ...
什么都不做,请使用fgets
:
data.txt中:
one
two
three
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUF_LEN 32
extern char *strdup(const char *);
int main(void)
{
char **arr = NULL;
char buf[BUF_LEN];
size_t i, n = 0;
FILE *f;
f = fopen("data.txt", "r");
if (f == NULL) {
perror("fopen");
exit(EXIT_FAILURE);
}
while (fgets(buf, BUF_LEN, f)) {
arr = realloc(arr, sizeof(*arr) * (n + 1));
if (arr == NULL) {
perror("realloc");
exit(EXIT_FAILURE);
}
arr[n] = strdup(buf);
if (arr[n++] == NULL) {
perror("strdup");
exit(EXIT_FAILURE);
}
}
for (i = 0; i < n; i++) {
printf("%s", arr[i]);
free(arr[i]);
}
free(arr);
}
答案 1 :(得分:0)
你说过,你确实需要一串字符串。想想看,字符串是一个字符序列/数组,对吧?所以你需要一组字符数组。
现在,char *
能够指向一个角色并间接指向后续角色(如果有的话)。这就是我们所说的字符串,以及我们如何拥有它:
char * astring = malloc( 256 * sizeof * astring );
// astring holds an adress pointing to a memory location
// which has the capacity of 256 *astring s
// astring is a string tha can hold 255 characters
// with the full-stop '\0' at the end
现在你需要10个这样的,10个char *
个。 char **
可以指向他们,就像char *
可以char
一样。
char ** lines = malloc( 10 * sizeof * lines );
for ( int i = 0; i < 10; i++ )
lines[i] = malloc( 256 );
// sizeof may be omittid for chars
如果您计划增加10,最好将其存储在变量中,在需要时将其加倍并相应地重新分配。
int numlines = 10;
int linelength = 256;
char ** lines = malloc( numlines * sizeof * lines );
for( int linenr = 0; fgets( lines[linenr] = malloc( linelength ), linelength, yourfile ) != EOF; linenr++ ) {
if ( linenr + 1 == numlines ) {
numlines *= 2;
lines = realloc( lines, numlines * sizeof * lines );
}
}
包含必要的标题,填写空白并检查分配和fopen
是否成功,确保256就足够了,必要时增加。您也可以选择自适应,但这需要更多代码。