下面的代码假设是读取并存储输入的文本文件,并将其内容动态地存储在结构中。第一个数字是专辑数量,第二个是此专辑中的曲目数量,每个标题前面的数字是该标题中的字符数。
对于我到目前为止编写的代码,我试图使每个相册与每个相关的1个独立结构相关联,因此我创建了一个Struct数组。因此,目前我能够正确读取专辑数量和曲目数量。但是,我在struct album
中遇到指针数组问题。我无法为它动态分配正确的内存,以及将所有(在本例中为17个)轨道名称存储到整个指针数组中,而没有轨道标题前面的数字。
示例文本文件:
1
17
16 Like an umbrella
...
15 Dynasty Warrior
代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct album
{
int num_tracks;
char *tracks[];
};
int main(int argc, char *argv[]){
int numbALBUMS=0, numbCharInTrack=0;
int i=0,j=0;
FILE *albums;
albums = fopen (argv[1], "r");
fscanf(albums, "%d", &numbALBUMS);
struct album info[numbALBUMS];
for(i=0;i<numbALBUMS;i++){
fscanf(albums, "%d", &info[i].num_tracks);
for(j=0;j<info[i].num_tracks;j++){
fscanf(albums, "%d" , &numbCharInTrack);
//NEED HELP HERE
//fscanf(albums,"s",info[i].tracks[j]);
}
}
fclose(albums);
return 0;
}
答案 0 :(得分:2)
struct Album info[numAlbums]
不正确,您必须执行以下操作:
struct Album *info = (struct album*)malloc(numAlbums * sizeof(struct Album));
type name[numOfElements];
形式的陈述只能用于静态分配。
您应该将char *tracks[]
替换为char **tracks
。你可以使用char * tracks [],但这更难。(如果你想查看它:What's the need of array with zero elements?)
然后你必须添加
info[i].tracks = malloc(sizeof(char*) * info[i].num_tracks);
在fscanf
语句之后的第一个for循环中。
要结束,您必须在最内层的for循环中,在第一个fscanf
语句之后,为包含trak名称的字符串分配内存。你可以这样做:
info[i].tracks[j] = malloc(sizeof(char) * (numbCharInTrack + 1)); //number of characters + '\0'
然后你可以从文件中读取曲目名称。
fgetc(album); //Read past the leading space
fgets(info[i].tracks[j], numbCharInTrack + 1, album);
修改强>
从文件代码中添加了读取名称。
将malloc(sizeof(char) * numbCharInTrack)
替换为malloc(sizeof(char) * (numbCharInTrack + 1))
,忘记终止空字符。