C语言 使用getline()从stdin重复读取行并将其存储在字符串数组中

twh00eeo  于 2023-01-01  发布在  其他
关注(0)|答案(1)|浏览(158)

我正在尝试使用函数getline(),它嵌入在另一个检查一些简单条件的函数中:

int scanItem( char ** list, size_t size ){
    int res = getline( list, &size, stdin );
    if ( res > 5 && res < 100 ){
        return 1;
    }
    return 0;
}

我想把来自stdin流的每一个新行存储到一个字符串数组中的一个新字符串中,但似乎有一个问题,每次我加载输入时,在它被新的替换之前加载的那个。

int main(void){
    char ** inputList = (char**)malloc( sizeof(char) * 100 * 100 );
    size_t size = 100*100;

    int i = 0;
    while ( scanItem(&inputList[i], size) == 1 ){
        i++;
    }
    if ( ! feof(stdin) ){
        error();
    }
    return EXIT_SUCCESS;
}

不确定我是否正确使用了该功能...

rdrgkggo

rdrgkggo1#

为了让getline为每个调用分配新指针,传递给它的指针需要指向NULL。

char ** inputList = (char**)malloc( sizeof(char) * 100 * 100 );

它为10000/sizeof(char *)指针分配空间,但不初始化它们,因此当getline读取这些未初始化的指针时,会出现未定义的行为。

char ** inputList = calloc(100, sizeof(char *));

为100个指针分配空间,并将它们都初始化为0。然后,对于循环,您需要类似于以下内容:

int i = 0;
while ( i < 100 && scanItem(&inputList[i], 0) == 1 ){
    i++;
}

这确保了你不会在列表末尾运行。size的值并不重要,因为如果指针为NULL,getline会忽略输入值,scanItem会丢弃返回值。

相关问题