Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 确定存储输入所需的数组长度_C_Arrays - Fatal编程技术网

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

C 确定存储输入所需的数组长度,c,arrays,C,Arrays,在Stdin中确定输入流长度的最佳方法是什么,这样您就可以创建一个正确长度的数组来存储它,例如使用getchar() 是否有某种方法可以窥视输入流中的所有字符,并使用以下内容: while((ch = readchar()) != "\n" ) { count++; } int size = 1; char *input = malloc(size); int count = 0; while((ch = getchar()) != '\n' ) { input[count

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

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

while((ch = readchar()) != "\n" ) {
    count++;
}
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);

然后用大小计数创建数组?

通常没有办法。前面只能看到一个字符,因此如果使用示例中的代码,这些字符已经被读取,即使您知道它们的计数并可以分配内存,也无法再次读取它们。
可能的策略是在开始时分配一些内存,如果达到限制,则在循环中重新分配内存,将长度增加一倍。

对典型的unix文件执行此操作的一种方法是使用
fseek
系统调用来确定文件的大小。不幸的是,
STDIN
通常不是可查找的流


处理我所知道的一般情况的唯一方法就是简单地使用动态内存分配。您可以使用初始缓冲区进行最佳猜测,一旦到达末尾,就可以
malloc
创建一个新数组并重新开始。处理此过程中的错误是许多经典安全漏洞的开始

在我输入代码的过程中,有几个类似的答案。恐怕您需要做如下操作:

while((ch = readchar()) != "\n" ) {
    count++;
}
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库函数。即


在这两种情况下,完成输入后不要忘记释放输入。

可以在命令行传递吗?通常的方法是在读取和填充数组时动态地增长数组。这(a)可能比读取两次输入更快,(b)如果输入流不可查找,这是唯一的方法。(适用于所有流的代码比只适用于可查找流的代码更易于重用。)@Grijesh是的,但是,假设我不想依赖用户精确地计算段落或其他内容中的字符数,这种情况显然打破了这种方法:
stdin
是控制台,用户键入的内容比键盘缓冲区长;)如果标准输入是磁盘文件(
program
),则可以使用
fseek()
ftell()
,或者在POSIX上可以使用
stat()
。如果输入可以是管道、终端、插座、FIFO等,那么您无法在标准输入上查找,您必须在执行时进行分配。不要一次分配一个额外字符;它变得昂贵得令人望而却步。使用大小加倍规则,如s.+1。当然,对于生产实现,您需要检查对
malloc
realloc
的所有调用的返回,以确保它们不为NULL。此外,此实现允许输入中使用空字符,这使得可靠地解释结果变得非常困难…非常感谢!我刚开始学C,所以我得好好学习这些指针的东西。快速问题:为什么需要添加额外的0?为什么不能直接在循环之后
input=realloc(input,count)
?实际上不需要。但是,它有双重效果,您可以在
输入上使用所有与字符串相关的函数,并且可以确保count!=最后一行为0。请注意,代码
input=realloc(input,size)是一个小灾难。在调用之前,有一个指向内存
输入的指针。如果重新分配失败,
input
已设置为null,因此无法再访问以前(仍然)分配的内存-内存泄漏。对于不断增长的分配(分配的空间增加),始终使用
void*new\u ptr=realloc(旧的、新的大小)上的变量;如果(new_space==0)…句柄内存不足…;旧的\u ptr=新的\u ptr。对于像上次一样缩减再分配,你没问题。总是检查!