狗日的scanf-------------关于不定长度的数据输入到数组

每次玩C语言的时候,看到scanf都他妈的一肚子火,我觉得当初设计scanf的大牛脑子都不正常,搞得我们这些菜鸟晕头转向,仔细研究你会发现scanf的规则之多让人蛋疼,稍不注意你就得不到你想要的输入结果。

今天我想说下关于很多人会问的 不定长的数据输入到数组的情况,网上搜了很多,很多人的答案我也运行过,都不正确,跟同学讨论了会,得出一个反正我在VS上运行通过的版本。

比如:1 2 3 4 5 6 ......10 11 的一串整型数据,没有固定长度,要输入到一个数组中,以回车键结束 该如何去做?

 

方法一:见代码

#include<stdio.h>
#include <stdlib.h>
#include <string.h>

void main(void) 
{ 

	int i =0;
	char c;
	int count = 3;
	int *a = (int*)malloc(sizeof(int));
	int n;

	 while( scanf("%d",&n)){//读取成功返回读取的个数,返回1 ,读取失败返回 0
		a[i] = n;
		i++;
		a = (int *)realloc(a,(i*sizeof(int)+sizeof(int)));//已有空间大小为i ,追加 1个,总大小为i+1
		
		if((c = getchar()) == '\n')//getchar()每次可以读取到空格,当输入完毕后,将读取回车键
			break;
	 
	}

	for(int j = 0; j<i;j++)
		printf("%d ",a[j]);

	system("pause");
		return; 
}


上面这种方法很方便,但是当数据很多的时候效率很低,因为realloc追加空间是重新找一块大的内存,再将原先的数据复制到新内存中,这样每来一个数据就要复制一次,效率很低;可以用如下的改进版:




#include<stdio.h>
#include <stdlib.h>
#include <string.h>

void main(void) 
{ 

	int i =0;
	char c;
	int count = 10;
	int *a = (int*)malloc(10*sizeof(int));//初始分配10个大小的空间
	int n;

		  while( scanf("%d",&n)){
		  a[i] = n;
		  i++;
		  if((c = getchar()) == '\n')
			break;;
		  if(i>=count)
			{
				a = (int *)realloc(a,(i+10)*sizeof(int));//当空间不够,继续追加
				count += 10;
		   }
	  }

	for(int j = 0; j<i;j++)
		printf("%d ",a[j]);

	system("pause");
		return; 
} 



 


这种方法,复制的次数就会减少,只是会浪费一些空间。

  • 0
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值