我已经用C实现了动态数组数据结构;我现在正在寻找一种适当的方法来从标准输入中填充数组。使用scanf()
或fgets()
似乎不是一个好主意,因为它们的缓冲区大小在编译时是固定的,所以我会失去结构的动态性。因此,我使用getline()
并为要放入数组中的每个字符动态分配内存。
我编写了此函数来填充stdin中的两个数组:
//input arrays from keyboard
void use_input_array(){
char *line = NULL;
size_t len = 0;
ssize_t read;
puts("Enter your first ARRAY : ");
struct dynarray *first;
create_dynarray(&first, 1);
while((read = getline(&line, &len, stdin)) != -1){
if(read > 0){
add_elem(first, line);
}
}
free(line);
char *sline = NULL;
size_t slen = 0;
ssize_t sread;
puts("Enter your second ARRAY :");
struct dynarray *second;
create_dynarray(&second, 1);
while((sread = getline(&sline, &slen, stdin)) != -1){
if(sread > 0){
add_elem(second, sline);
}
free(sline);
}
puts("END");
}
当我执行函数时,我可以毫无问题地插入第一个字符串,但是当涉及到第二个字符串时,执行将直接结束。我不知道为什么会这样。这是一个小的可编译示例,可以更好地显示我的问题:
#include<stdio.h>
#include<stdlib.h>
typedef struct dynarray
{
void **memory;
size_t allocated;
size_t used;
int index;
} dynarray;
void create_dynarray(dynarray **array, size_t size)
{
*array = calloc(size, sizeof **array);
(*array)->memory = NULL;
(*array)->allocated = 0;
(*array)->used = 0;
(*array)->index = -1;
}
//adds a new element at the bottom of dynarray
void add_elem(dynarray *array, void *data)
{
size_t toallocate;
size_t size = sizeof(void *);
if ((array->allocated - array->used) < size){
toallocate = array->allocated == 0 ? size : (array->allocated * 2);
array->memory = realloc(array->memory, toallocate);
array->allocated = toallocate;
}
array->memory[++array->index] = data;
array->used = array->used + size;
}
//input arrays from keyboard
void use_input_array(){
char *line = NULL;
size_t len = 0;
ssize_t read;
puts("Enter your first ARRAY : ");
struct dynarray *first;
create_dynarray(&first, 1);
while((read = getline(&line, &len, stdin)) != -1){
if(read > 0){
add_elem(first, line);
}
}
free(line);
char *sline = NULL;
size_t slen = 0;
ssize_t sread;
puts("Enter your second ARRAY :");
struct dynarray *second;
create_dynarray(&second, 1);
while((sread = getline(&sline, &slen, stdin)) != -1){
if(sread > 0){
add_elem(second, sline);
}
free(sline);
}
puts("END");
}
int main(){
use_input_array();
}
另一个问题与以下事实有关:我的输入字符串是char
的数组,但是我的结构构建为无类型,因此需要空指针。我可以创建一个int
,double
等数组来执行转换,但这也意味着要具有固定的大小。我在考虑实现自己的coverage函数并在插入元素之前对其进行调用在数组中。但是我真的不知道从哪里开始...有什么建议吗?谢谢。
答案 0 :(得分:2)
类似的事情可能起作用。
getline
仅需要一个指针。由于为指针分配了array->memory[++array->index] = data;
,因此每次迭代都需要分配更多的内存。将line
设置为NULL,并将len
设置为零。
当输入空行时,请考虑打破循环。 '\n' == line[0]
。
最后免费提供line
。
char *line = NULL;
size_t len = 0;
ssize_t read;
puts("Enter your first ARRAY : ");
struct dynarray *first;
create_dynarray(&first, 1);
while((read = getline(&line, &len, stdin)) != -1){
if ( '\n' == line[0]) {
break;
}
if(read > 0){
add_elem(first, line);
line = NULL;
len = 0;
}
}
puts("Enter your second ARRAY :");
struct dynarray *second;
create_dynarray(&second, 1);
while((read = getline(&line, &len, stdin)) != -1){
if ( '\n' == line[0]) {
break;
}
if(read > 0){
add_elem(second, line);
line = NULL;
len = 0;
}
}
free(line);