确定存储输入所需的数组长度

时间:2014-01-25 17:41:28

标签: c arrays

确定Stdin中输入流长度的最佳方法是什么,以便您可以使用getchar()创建一个正确长度的数组来存储它?

是否有某种方法可以窥视输入流中的所有字符并使用以下内容:

while((ch = readchar()) != "\n" ) {
    count++;
}

然后创建具有大小计数的数组?

3 个答案:

答案 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一个新的数组并重新开始。处理此过程的错误是许多经典安全漏洞的开始。