2015-12-19 26 views
0

我想读取用户输入合并字符串和数字,像这样:分配结构的数组,数组内

50:string one 
25:string two blablabla 
... 

我不知道投入将有多少行有,我也不要不知道弦的最大长度。

因此,我创建

typdedef struct line 
{ 
    int a 
    char *string 
} line; 

那么这sturct

line *Array = NULL; 

现在我有一个循环,读取一行并将其解析到temporaryString和temporaryA的数组。我如何重新分配数组以将它们复制到数组中?

+2

通过使用['realloc'](http://en.cppreference.com/w/c/memory/realloc)函数? –

+1

可能的重复[如何使此函数采取任意字符串?](http://stackoverflow.com/questions/34353204/how-do-i-make-this-function-take-arbitrary-strings) –

回答

0

你可能会这样(伪代码)。

idx = 0; 

while (input = read()) { 
    temporaryString, temporaryA = parse(input); 
    Array = realloc(Array, (idx + 1)*sizeof(line)); 
    Array[idx].a = temporaryA; 
    Array[idx].string = malloc(strlen(temporaryString) + 1); 
    strcpy(Array[idx].string, temporaryString); 
    idx++; 
} 
1

有两种有效的选择,你想要做什么:

1)使用realloc()功能;它就像malloc和calloc一样,但你可以重新分配你的记忆,因为名字可以提供建议;

2)使用链表;

第二个比第一个更复杂,但也是非常有效的。在你的情况,一个简单的链表可能有以下形式:

typdedef struct line 
{ 
    int a; 
    char *string; 
    line *next; 
    //line *prev; 

} line; 

每次你添加一个节点,你必须页头和你的新的数据结构线,接着设置指针为NULL或本身,这是相同的,并将上一个下一个指针设置为您创建的新数据。这是手动执行realloc的简单方法。只有当你需要从最后一个项目到第一个项目时才需要prev指针;如果你不需要这个功能,只需保存根指针(第一个),并只使用下一个指针。