C语言中,对于未知输入数组size的处理,输入数据同时,并扩充数组的size

期末考完事,正好有时间系统的过了一遍C语言基础(小菜一枚)

在慕课上,刷了一遍浙大翁恺的课程(对于c基础差的,极力推荐,讲的非常棒),主要是想再深入学习下指针、链表的知识。

本次学习,最大的收获莫过于,掌握了如何灵活的使用数组。

我们都知道,在c中,其实数组本质上也是指针的一种形式,一旦定义以后,数组的长度就确定了,不能改变。

对于输入长度未知的一连串数据,想要把它用数组记录下来,还是有点麻烦的。当然,你可以直接给数组开一个很大很大的空间,

但是 1、再大的长度,也可能有越界的情况。 2、最好不要养成这样写代码的习惯。

好,废话少说,直接附上自己的源代码。(其实最主要的部分,就是那个inflate函数,对于数组的扩充关键。

//这个是array.h文件

#ifndef _ARRAY_H_
#define _ARRAY_H_

typedef struct {
	int *array;
	int size;
} Array;

Array array_creat(int init_size);
void array_free(Array *a);
int array_size(const Array *a);
int* array_at(Array *a,int index);
void array_inflate(Array *a,int more_size);

#endif
#include "array.h"
#include<stdio.h>
#include<stdlib.h>

const BLOCK_SIZE = 5; //每次扩充数组的size 
Array array_creat(int init_size)//创建一个数组 
{
	Array a;
	a.array = (int*) malloc(sizeof(int)*init_size);
	a.size =init_size;
	return a;
}

void array_free(Array *a)//用完之后,要释放数组所占的内存空间 
{
	free(a->array);
	a->array = NULL;
	a->size = 0;
}
int array_size(const Array *a) //,获得数组size,封装,保护具体的函数细节 
{
	return a->size;
}
int* array_at(Array *a,int index)//访问数组内部的数据,读和写都可以 
{
	if( index >= a->size ){ //如果写入的size超过原数组size,进行数组扩充,每次扩充 一个BLOCK,可以修改 
		array_inflate(a,(index/BLOCK_SIZE+1)*BLOCK_SIZE-a->size);
	}
	return &(a->array[index]);
 } 
int array_get(const Array *a,int index)
{
	return a->array[index];
} 
void array_set(Array *a,int index,int value)
{
	a->array[index] = value;
}
void array_inflate(Array *a,int more_size)//长大,通过重新申请空间,并释放原数组的空间 
{
	int *p = (int*)malloc(sizeof(int)*(a->size + more_size));
	int i;
	for ( i=0; i<a->size; i++){
		p[i] = a->array[i];
	}
	free(a->array);
	a->array = p;
	a->size += more_size;
}

int main()
{
	Array a = array_creat(1);//创建一个size为1的数组 
	*array_at(&a,0) = 10;//向数组写入一个数据 
	printf("array_size=%d\n",array_size(&a));//输出数组的size 
	int number;
	int cnt = 0;
	while ( number != -1) {  //可以无限输入数据,不断的扩充数组size 
		scanf("%d",&number);
		if( number != -1)
			*array_at(&a,cnt++) = number;
	}
	printf("array_size=%d\n",array_size(&a));//输出数组的size 
	for ( cnt=0; cnt<a.size; cnt++){//输出数组的全部数据,这里有个bug,未写入空间,可能是一些随机的数据 
		printf("a[%d]=%d\t",cnt,*array_at(&a,cnt));
	}

	array_free(&a);//释放数组空间 
	
	return 0;
}


第一次写c语言的博客,有问题,欢迎一起探讨!

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值