Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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_Input_Integer - Fatal编程技术网

多次读取同一输入-C

多次读取同一输入-C,c,arrays,input,integer,C,Arrays,Input,Integer,我想问一下,是否可以多次读取同一输入(stdin)?我将得到一个非常大的数字,包含数千个数字(因此我无法将其存储在变量中,(而且我也不能使用文件夹!)。我的想法是将数字放入int数组,但我不知道数组应该有多大,因为输入中的数字量可能会有所不同。我必须编写通用解决方案。 所以我的问题是,在我将数字复制到数组之前,如何解决它,以及如何找出数字的数量(以便我可以初始化数组)。我尝试了多次使用scanf(),或scanf()和getchar,但都不起作用。请参阅我的代码: int main(){ int

我想问一下,是否可以多次读取同一输入(stdin)?我将得到一个非常大的数字,包含数千个数字(因此我无法将其存储在变量中,(而且我也不能使用文件夹!)。我的想法是将数字放入int数组,但我不知道数组应该有多大,因为输入中的数字量可能会有所不同。我必须编写通用解决方案。 所以我的问题是,在我将数字复制到数组之前,如何解决它,以及如何找出数字的数量(以便我可以初始化数组)。我尝试了多次使用scanf(),或scanf()和getchar,但都不起作用。请参阅我的代码:

int main(){
int c;
int amountOfDigits=5;
while(scanf("%1d",&c)!=' '){//finding out number of digits with scanf
    if(isdigit(c)==0){
        break;
    }
    amountOfDigits++;
}

int digits[amountOfDigits];//now i know lenght of array, and initialize it
for(int i=0;i<amountOfDigits;i++){//putting digits into array
    digits[i]=getchar();
}

for(int i=0;i<amountOfDigits;i++){//printing array
    printf("%d",digits[i]);
}
printf("\n");

return 0;
}
intmain(){
INTC;
int amountOfDigits=5;
while(scanf(“%1d”,&c)!=”{//使用scanf查找位数
if(isdigit(c)==0){
打破
}
数字++;
}
int digits[amountOfDigits];//现在我知道了数组的长度,并对其进行了初始化
对于(int i=0;i
是否可以多次读取同一输入(stdin)

(我猜您是一名开始编程的学生,您正在使用Linux;如果不是,请修改我的答案)

对于您的家庭作业,您不需要多次读取同一输入。在某些情况下,可能(当标准输入为正版文件时,即当您在命令中使用某些文件时)。在其他情况下(例如,当标准输入为管道时,例如使用;或在shell命令中使用…),无法读取多次stdin(但你不需要这样做)。一般来说,不要期望
stdin
可以与or一起查找(通常不是)

(我不打算做你的家庭作业,但这里有一些有用的提示)

所以我无法将其存储在变量中,(而且我也不能使用文件夹!)

你可以做几件事:

  • (因为您提到了文件夹…)您可能会使用一些更复杂的方法在磁盘上存储数据(但在您的特定情况下,我不建议使用…)。这些方法可能是一些直接访问的文件(丑陋的),或一些索引文件,或一些数据库,甚至是一些类似服务器的文件。
    在您的情况下,您不需要任何这些;我之所以提到它,是因为您提到了“文件夹”,而您的意思是“文件夹”

  • 您确实应该使用一些堆分配内存,因此请阅读并仔细阅读每个标准的文档,如
    malloc
    realloc
    free
    。您的程序可能应该使用这三个功能(不要忘记
    malloc
    &
    realloc

阅读和回答。两者都有惊人的相关性

你或许应该保持:

  • 指向堆分配的
    int
    -s的指针(实际上,您可以使用
    char
    -s)

  • 该指针的分配大小

  • 所用的长度,即实际有用位数

  • 您当然不希望通过在每个循环中重复执行
    realloc
    来增长数组(这是低效的)。实际上,您可以调整一些增长方案,如
    newsize=3*oldsize/2+10
    ,以避免在(输入循环的)每个步骤中重新分配内存

    你应该感谢你的老师做了这么有用的练习,但你不应该指望他会做作业



    还要注意(称为bignums或bigints)。实际上很难有效地编写代码,因此在现实生活中,您可能会使用类似的库。

    分配一些内存。使用
    fgets
    读取。如果输入没有以换行符结尾,请重新定位内存并重复(读取到前一个字符串结尾)。我肯定有重复的。不,一般来说,你不能重新读取输入。正如Weather Vane所提到的,通常的做法是
    malloc
    ,然后
    realloc
    一些内存,当你读取越来越多的输入时,数组会越来越大。或者,在许多系统上有一个库函数
    getline
    ,它可以为你实现这一点u自动。您必须使用动态分配:malloc()/realloc()。但是,如果您在Linux上,如果信息被重定向到您的程序,您可以使用
    STDIN\u FILENO
    mmap
    输入流。谢谢您的回复,您能解释一下为什么我不应该太频繁地(在每个循环中)调用calloc吗?我不想创建超出需要的空间。这将是低效的。而且内存很便宜。你当然可以承受“丢失”25%的内存。所以你应该(在实践中)创建超出必要的空间。当然,当您编写处理TB数据的程序时,您的关注点会大不相同。顺便说一句,不要忘记开发人员时间(您花在代码上的时间)也很昂贵(并且通常比您运行程序的硬件更昂贵)。