在 C 中,我可以使用该char *fgets(char *s, int size, FILE *stream)
函数从标准输入读取用户输入。但用户输入的大小仅限于size
. 如何读取可变大小的用户输入?
问问题
134 次
2 回答
1
此函数从标准输入读取直到遇到文件结尾,并返回读取的字符数。修改它以准确读取一行或类似内容应该相当容易。
ssize_t read_from_stdin(char **s)
{
char buf[1024];
char *p;
char *tmp;
ssize_t total;
size_t len;
size_t allocsize;
if (s == NULL) {
return -1;
}
total = 0;
allocsize = 1024;
p = malloc(allocsize);
if (p == NULL) {
*s = NULL;
return -1;
}
while(fgets(buf, sizeof(buf), stdin) != NULL) {
len = strlen(buf);
if (total + len >= allocsize) {
allocsize <<= 1;
tmp = realloc(p, allocsize);
if (tmp == NULL) {
free(p);
*s = NULL;
return -1;
}
p = tmp;
}
memcpy(p + total, buf, len);
total += len;
}
p[total] = 0;
*s = p;
return total;
}
于 2013-02-03T12:30:26.660 回答
1
在 C 中,您负责缓冲区,并负责它们的大小。所以你不能为你准备一些动态缓冲区。因此,唯一的解决方案是使用循环(fgets 或 fgetc - 取决于您的处理和停止条件)
如果你超越 C 到 C++,你会发现你可以接受可变大小的 std::string 对象(你需要处理单词和/或行终止 - 并再次循环)
于 2013-02-03T12:30:39.327 回答