zoukankan      html  css  js  c++  java
  • c语言输入一行未知个数数字存入数组

    一直有个疑问输入一行数字存入数组时若不知道数字的个数怎么办,最容易想到的办法就是接收字符然后转化为数字,但这样太过麻烦。

    今天上网查了下,说可以用ungetc()函数将字符送回输入流,在这里总结归纳一下

    此外还意外的解决了另外一些以前遇到的问题,也是在调试代码时发现的,用此段代码可以用除了空格以外的字符作为分隔符,而且分隔符的长度也可以很长:如输入12qwertyuiop34asdfghjkl123,23zxc45  最后得到的数组为:a[0]=12,a[1]=34,a[2]=123,a[3]=23,a[4]=45

    先贴上代码:

     1 #include<stdio.h>
     2 #include<ctype.h>
     3 int main()
     4 {
     5     int a[1000];
     6     char c;
     7     int i=0;
     8     int n=0;
     9     while((c=getchar())!='
    ')
    10     {
    11         if(isdigit(c))
    12         {
    13             ungetc(c,stdin);//将c送回输入流
    14             scanf("%d",&a[n++]);
    15         }
    16     }
    17     for(i=0;i<n;i++)
    18     {
    19         printf("%d ",a[i]);
    20     }
    21     return 0;
    22 }

    这里要说明一下,在使用空格作为分隔的时候把14行的scanf函数放到if语句外面可以减少循环次数

    但是用其他符号作为分隔符的时候只能放在if语句中,不然会出错

    这里又有另一个问题了,一开始怎么知道数组的长度,定义多少合适呢?

    1. 如果预先可以估计数组的大小,那么可以比估计的数值定义的稍大一些即可
    2. 如果无法预知,我的解决办法就是使用链表,但是这样就无法使用数组的一些特性,比如可能会花很多的时间去寻找某一下标的数据
    3. 另外我想到的就是牺牲存储空间的办法,先用链表将数据存起来,并记录个数。如果后面需要多次利用下标访问数据的话,可动态分配一块内存来存储数据,并将原来的链表释放,或根据需要保留
    4. 除此之外也没想到有什么好的方法。。。
  • 相关阅读:
    hdu 5007 水题 (2014西安网赛A题)
    hdu 1698 线段树(成段替换 区间求和)
    poj 3468 线段树 成段增减 区间求和
    hdu 2795 公告板 (单点最值)
    UVaLive 6833 Miscalculation (表达式计算)
    UVaLive 6832 Bit String Reordering (模拟)
    CodeForces 124C Prime Permutation (数论+贪心)
    SPOJ BALNUM (数位DP)
    CodeForces 628D Magic Numbers (数位DP)
    POJ 3252 Round Numbers (数位DP)
  • 原文地址:https://www.cnblogs.com/wd1001/p/4826855.html
Copyright © 2011-2022 走看看