gpt4 book ai didi

c - 如何使用 fgets 读取未知长度的输入

转载 作者:太空狗 更新时间:2023-10-29 17:02:02 26 4
gpt4 key购买 nike

我应该如何使用 fgets() 读取长输入,我不太明白。

这是我写的

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

int main()
{
char buffer[10];
char *input;
while (fgets(buffer,10,stdin)){
input = malloc(strlen(buffer)*sizeof(char));
strcpy(input,buffer);
}
printf("%s [%d]",input, (int)strlen(input));
free(input);
return 0;
}

最佳答案

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

int main(void)
{
char buffer[10];
char *input = 0;
size_t cur_len = 0;
while (fgets(buffer, sizeof(buffer), stdin) != 0)
{
size_t buf_len = strlen(buffer);
char *extra = realloc(input, buf_len + cur_len + 1);
if (extra == 0)
break;
input = extra;
strcpy(input + cur_len, buffer);
cur_len += buf_len;
}
printf("%s [%d]", input, (int)strlen(input));
free(input);
return 0;
}

这是关于为您提供完整输入行的最小更改集。这一次最多增加 9 个字节的空间;这不是最好的方法,但是有额外的簿记涉及更好的方法(将分配的空间加倍,并记录分配了多少与使用了多少)。注意cur_len记录的是input指向的空间中不包括终端null的字符串长度。另请注意,使用 extra 可避免分配失败时的内存泄漏。

strcpy() 操作可以合法地替换为 memmove(input + cur_len, buffer, buf_len + 1)(在这种情况下,您可以使用 memcpy() 而不是 memmove(),但它并不总是有效,而 memmove() 确实有效,因此使用起来更可靠memmove()).


使用长度加倍 — cur_max 变量记录分配了多少空间,cur_len 记录了使用了多少空间。

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

int main(void)
{
char buffer[10];
char *input = 0;
size_t cur_len = 0;
size_t cur_max = 0;
while (fgets(buffer, sizeof(buffer), stdin) != 0)
{
size_t buf_len = strlen(buffer);
if (cur_len + buf_len + 1 > cur_max)
{
size_t new_len = cur_max * 2 + 1;
if (buf_len + 1 > new_len)
new_len = buf_len + 1;
char *extra = realloc(input, new_len);
if (extra == 0)
break;
input = extra;
cur_max = new_len;
}
strcpy(input + cur_len, buffer);
cur_len += buf_len;
}
printf("%s [%d]", input, (int)strlen(input));
free(input);
return 0;
}

关于c - 如何使用 fgets 读取未知长度的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27326839/

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