gpt4 book ai didi

c - 读取输入的动态缓冲区大小

转载 作者:太空宇宙 更新时间:2023-11-04 02:27:32 25 4
gpt4 key购买 nike

我正在尝试创建一个程序,它将从标准输入中逐行读取,在该行中搜索给定单词的开头和结尾,并输出所有匹配的单词。这是代码:

int main()
{
char buffer[100];
char **words = NULL;
int word_count = 0;

while (fgets(buffer, sizeof(buffer), stdin) != NULL) {
int length = strlen(buffer);
if (buffer[length - 1] == '\n') {
word_count = count_words(buffer, FIRSTCHAR);
if (word_count > 0) {
words = get_words(buffer, FIRSTCHAR, LASTCHAR);
for (int i = 0; i < word_count; ++i) {
printf("%s\n", words[i]);
free(words[i]);
}
free(words);
}
}
}
return 0;
}

我的基本功能正常运行,但我依赖于具有固定缓冲区大小的 fgets()。我想要的是根据每行的长度动态分配一个大小的内存缓冲区。

我只能看到解决它的一种方法,即使用 fgetc 迭代输入并增加一个计数器直到行尾并使用该计数器代替 sizeof( buffer),但我不知道如何让 fgetc 读取正确的相关行。

有什么聪明的方法可以解决这个问题吗?

最佳答案

but I am relying on fgets() with a fixed buffer size. What I would like is to dynamically allocate a memory buffer with a size based on the length of each line

我确实为另一个读取整行并返回一个 SO 答案的 fgets 编写了一个版本malloc 分配整行内容的指针。这是代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char *fgets_long(FILE *fp)
{
size_t size = 0, currlen = 0;
char line[1024];
char *ret = NULL, *tmp;

while(fgets(line, sizeof line, fp))
{
int wholeline = 0;
size_t len = strlen(line);

if(line[len - 1] == '\n')
{
line[len-- - 1] = 0;
wholeline = 1;
}

if(currlen + len >= size)
{
// we need more space in the buffer
size += (sizeof line) - (size ? 1 : 0);
tmp = realloc(ret, size);
if(tmp == NULL)
break; // return all we've got so far
ret = tmp;
}

memcpy(ret + currlen, line, len + 1);
currlen += len;

if(wholeline)
break;
}

if(ret)
{
tmp = realloc(ret, currlen + 1);
if(tmp)
ret = tmp;
}

return ret;
}

诀窍是检查换行符是否被读取。如果它被阅读,那么你可以返回缓冲区,否则它会重新分配带有 sizeof line 的缓冲区 more字节并将其附加到缓冲区。如果您愿意,可以使用此功能。

另一种方法是,如果您使用的是 POSIX 系统和/或使用 GNU GCC 进行编译,那么您可以使用getline

void foo(FILE *fp)
{
char *line = NULL;
size_t len = 0;

if(getline(&line, &len, fp) < 0)
{
free(line); // man page says even on failure you should free
fprintf(stderr, "could not read whole line\n");
return;
}

printf("The whole line is: '%s'\n", line);

free(line);

return;
}

关于c - 读取输入的动态缓冲区大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48937908/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com