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. 除此之外也没想到有什么好的方法。。。
  • 相关阅读:
    EL 自定义函数
    Linux 软件安装管理
    Linux 网络环境查看命令
    Linux 用户和用户组的命令
    Linux 用户和用户组进阶命令
    Linux 用户和用户组的基本命令
    将博客搬至CSDN
    U盘做系统启动盘(PE)时的文件格式选择 HDD ZIP FDD
    STM32 的几种输入输出模式
    define 中强制类型转换 && 浮点数后面带f
  • 原文地址:https://www.cnblogs.com/wd1001/p/4826855.html
Copyright © 2011-2022 走看看