0

变量还没有一成不变!如果没有缩进,请原谅。我是这个网站的新手。无论如何,我有一个包含五个不同类别的游戏列表的文本文档,我需要一些关于内存分配 VIA typedef 的帮助。一个人会怎么做?到目前为止,这就是我所拥有的:

/* 
Example of text document

2012 DotA PC 0.00 10
2011 Gran Turismo 5 PS3 60.00 12
list continues in similar fashion...
*/

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

//function prototype here

char **readFile(char *file);
char *allocateString(char temp[]);

typedef struct
{
    int year;
    char name[100];
    char system[10];
    float price;
    int players;
}game;


int main(void)
{
char **list;

system("pause");
return 0;
}

//function defined here
char **readFile(char *file) //reads file and and allocates
{ 
FILE* fpIn;
    int i, total=0;


    fpIn = fopen("list.txt", "r");
    if (!fpIn)
    {
        printf("File does not exist");
        exit(101);
    }

/*
allocate memory by row here VIA for loop with the total++ to keep track of the 
number of games
*/
/*
allocate memory individually for each item VIA "allocateString by using going 
to set list[i] = allocateStrng(tmpList) using for loop the for loop will have
for (i=0; i<total; i++)
*/

return;
}

//allocateString here
char *allocateString(char temp[]);
{
char *s;

s = (char*)calloc(strlen(temp+1), sizeof(char)));
strcpy(s, temp);

return s;
}
4

2 回答 2

2

通常,您会预先分配相当数量的内存,检测该数量不足的情况,并在这些情况下使用realloc(或malloc后跟memcpyand free)扩大分配。该建议适用于您读取当前行的缓冲区(将作为tempto传递allocateString)和用于保存所有行序列的数组。

调用but still后fgets(buf, bufsize, fpIn),您可以检测到行缓冲区的缓冲区大小不足。换句话说,当读取填满了整个缓冲区,但仍然没有到达换行符。在这种情况下,下一次读取将继续当前行。您可能需要一个内部循环来扩展缓冲区并在需要时再次读取。strlen(buf) == bufsize - 1buf[bufsize - 2] != '\n'

请注意,您allocateString的副本非常多strdup,因此您可能希望使用它。

上面文字中的链接主要来自GNU C库的手册cppreference.com是另一个很好的 C 函数文档来源。Linux 手册页也是如此。

于 2012-08-02T06:04:05.790 回答
0
s = (char*)calloc(strlen(temp+1), sizeof(char)));

//the name of the array is a pointer, so you are doing pointer arithmetic.  
//I think you want strlen(*temp+1, sizeof(char)));
 // or strlen(temmp[1]) it isn't clear if this is a pointer to a string or an array 
 // of strings
//you need the length of the string *temp is the content which temp points to

//strcpy(s, temp);
于 2012-08-02T06:51:33.113 回答