确定Stdin
中输入流长度的最佳方法是什么,以便您可以使用getchar()
创建一个正确长度的数组来存储它?
是否有某种方法可以窥视输入流中的所有字符并使用以下内容:
while((ch = readchar()) != "\n" ) {
count++;
}
然后创建具有大小计数的数组?
答案 0 :(得分:4)
在我输入代码的过程中,有几个类似的答案。我担心你需要做类似的事情:
int size = 1;
char *input = malloc(size);
int count = 0;
while((ch = getchar()) != '\n' ) {
input[count++] = ch;
if (count >= size) {
size = size * 2;
input = realloc(input, size);
}
}
input[count++] = 0;
input = realloc(input, count);
或者,您可以将其用作POSIX库函数getline()
。即。
int count, size;
char *input = NULL;
count = getline(&input, &size, stdin);
在这两种情况下,一旦完成输入,请不要忘记自由输入。
答案 1 :(得分:0)
一般来说没有办法。你可以只查看前面的一个字符,所以如果你使用像你的例子中的代码,那么字符就已经被读取,即使你知道它们的数量并且可以分配内存,你也不能再读它们。 可能的策略是在开始时分配一些内存,然后在循环中如果达到限制则重新分配内存,将长度加倍。
答案 2 :(得分:0)
使用典型的unix文件执行此操作的一种方法是使用fseek
系统调用来确定文件的大小。不幸的是,STDIN
通常不是可搜索的流。
处理我所知道的一般情况的唯一方法是简单地使用动态内存分配。你用一个初始缓冲区做出最好的猜测,一旦你到达终点,你malloc
一个新的数组并重新开始。处理此过程的错误是许多经典安全漏洞的开始。