多次读取相同的输入 - C.

时间:2018-03-29 22:08:54

标签: c arrays input integer

我想问你是否有可能多次读取相同的输入(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;
}

1 个答案:

答案 0 :(得分:2)

  

是否可以多次读取相同的输入(stdin)?

(我猜你是一名开始learn编程的学生,而你正在使用Linux;如果不是,请调整我的答案)

对于您的作业,您不需要多次读取相同的输入。在某些情况下,有可能(当标准输入是真正的文件时 - seekable - ,即在命令中使用某些redirection时)。在其他情况下(例如,当标准输入是管道时,例如使用command pipeline;或者在shell命令中使用here documents ...),无法多次读取 stdin < / em>(但你不需要)。一般情况下,不要期望使用fseekrewind(通常不会)stdin寻找malloc

(我不会做你的作业,但这里有用的提示)

  

因此我无法将其存储在变量中(并且我也无法使用文件夹!)

你可以做几件事:

  • (因为你提到了文件夹....)你可能会使用一些更复杂的方法在磁盘上存储数据(但在你的特定情况下,我不推荐。 ..)。这些方式可能是某些直接访问的文件(丑陋),或某些索引文件àlagdbm,或某些数据库àlasqlite甚至某些RDBMS服务器,如PostGreSQL
    在您的情况下,您不需要任何这些;我提到它,因为你提到“文件夹”,你的意思是“directories”!

  • 你真的应该使用一些堆分配内存,所以请阅读C dynamic memory allocation并仔细阅读 每个标准memory management functions的文档例如reallocfreemalloc。您的程序应该使用所有这三个功能(不要忘记realloc&amp; int可能会失败。

阅读thisthat个答案。两者都具有惊人的相关性。

你可能应该以某种方式保持:

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

  2. 指针的分配大小

  3. 该东西的使用长度,即实际有用位数。

  4. 你当然不希望在每个循环中重复newsize = 3*oldsize/2 + 10来增长你的数组(这是低效的)。在实践中,您将调整一些增长方案,如name | email | date -------------------------------------------- Mario Rossi | mario@test.com | 2018/03/08 Luigi Bianchi | luigi@test.com | 2018/02/25 Giuseppe Verdi | giuse@test.com | 2018/09/01 ,以避免在每个步骤(输入循环)重新分配内存。

    你应该感谢你的老师做了一个非常有用的练习,但你不应该期望StackOverflow做你的功课!

    还要注意arbitrary-precision arithmetic(称为bignums或bigints)。实际上很难有效地编码,因此在现实生活中你会使用像GMPlib这样的库。