将注释读入动态大小的数组中

时间:2016-01-18 18:13:02

标签: c arrays

所以我在我的标记文件中有一系列评论:

# comment1
# comment2

我想将这些读入一个数组,添加到我的struct中的注释数组中。 我不知道提前评论行的数量

我在结构中声明了注释数组,如下所示:

char *comments; //comment array

然后我开始阅读评论,但我得到的是没有工作:

int c;
//check for comments
c = getc(fd);
while(c == '#') {
    while(getc(fd) != '\n') ;
    c = getc(fd);
}
ungetc(c, fd);
//end comments?

我甚至关闭了吗?

由于

3 个答案:

答案 0 :(得分:1)

第一

char *comments; //comment array

一条评论不是一系列评论。

您需要使用realloc来创建字符串数组

char**comments = NULL;
int count = 10; // initial size
comments  = realloc(comments, count);

当你得到>计数

count*=2;
comments = realloc(comments, count);// classic doubling strategy

将一个字符串放入数组中(假设注释是一个带有一条注释的char *

   comments[i] = strdup(comment);

答案 1 :(得分:0)

您可以使用fgets()表格<stdio>来阅读一行。

int num_comments = 0;
char comment_tmp[82];
char comment_arr[150][82];
while(comment_tmp[0] != '#' && !feof(file_pointer)){
    fgets(comment_tmp, 82, file_pointer);
    strcpy(comment_arr[num_comments], comment_tmp);
    num_comments++;
}

这有限,只能存储150条评论。这可以通过1)设置更高的数字,2)使用动态内存分配(想想malloc / free),或者3)将注释组织成更灵活的数据结构(如链表)来克服。

答案 2 :(得分:0)

当你看到该行是注释存储时,注释变量中注释的值只是转到下一行并再次执行此循环。所以代码:

char c = getc(fd);
while(c == '#') {
    while(getc(fd) != '\n') /* remove ; */ {
    *comment = getc(fd);
    ++comment;
    }
}

或使用更简单的fscanf

fscanf(fd,"#%s\n",comment); /* fd is the file */

请注意,此处的评论是字符串,而不是字符串数组。

对于字符串数组,它将是:

#define COMMENT_LEN 256

char comment [COMMENT_LEN ][100];
int i = 0;
while(!feof(fd) || i < 100) {
     fscanf(fd,"#%s\n",comment[i]);
     getch(); /* To just skip the new line char */
     ++i;
}