动态内存分配数组(C语言实现)

动态输入数组小结+字符输入问题

动态内存分配数组

1. 可直接a[N];
2. 能知道N;
3. 一个个输入,遇换行停;

1.int a[N]; 
 // C99,变量可当下标,数组范围可变。  


2.int *a,n;
//定义一个指针a和变量n
  scanf(%d”,&n)// 输入n的值
  a=(int*)malloc((n+1)*sizeof(int))
  // 申请 N+1个 int 空间,a指向该空间(多申请一个空间,如果是字符动态数组就能放个0)
  //将 a 等同a[n],将其当数组用即可,这个也不难。


3.
这部分有好几种方法,都放一放。

 - 一段一段的申请数组空间;
 - 先暴力定义一段长数组的,输入至结束,再strlen看申请需要的空间;
 - 与realloc一起用,一点点扩大数组范围。
 
 
/* 一段一段申请*/
 {	int i=0,j=0,d=0,surplus=0;
 	char *p=0,*temp=0,c0;
 	p=(char *)malloc(10*sizeof(char));//p指向十个char的空间
 
 	while(1){
  		c0=getchar(); 
  		if(c0==10||c0==32||c0==13||c0==9) {//遇空格、换行、回车、TAB等停止
   			p[i]=0;//遇到空格类字符后,赋给数组最后一位
   			break;
  		}
  		p[i]=c0;//输入为非空格类字符,赋给p[i]
  		i++;
  		surplus=i%10;
 
  		if(surplus==0) { //分析第一次进入时
  		//i为10的倍数即 surplus=0,说明已经用完了10个char,p[0~9],已经赋值
   			d=i/10;// 第一次进入d=10/10=1,第二次d=20/10=2,依此类推
   			d++;
   			temp=(char*)malloc(10*d*sizeof(char));
   			//原有10个char,第一次进入后,重新申请20个char。第二次进入30个char,依此类推
   			for(j=0;j<i;j++){
    				temp[j]=p[j];//将p指向的值全部赋给新指向的位置
   			}
   			free(p);
   			p=temp;
  		}
 	}
 	return p;
 }
 


/*先定义一段长数组*/	 
{
    char s[100000];
    char ch;
    char *p;
    int n;
    scanf("%s",s);//输入一个字符串,scanf遇空格类停止
    n=strlen(s);
    p=(char*)malloc(sizeof(char)*(n+1));//申请n+1 char空间
    strncpy(p,s,n);//将s前n位赋给p
    p[i]=0;//最后一位补0
    return p;
}



/*与realloc一起用*/
{
      int i;
      char *p,c0;
      p=(char *)malloc(sizeof(char)*2);//申请两个char
      for(i=0;;i++){
  	realloc(p,i+2);//将p变成2-3-4-5等等个char
  	scanf("%c",&c0);
  	if(c0==10||c0==32||c0==13||c0==9) {
  		p[i]=0;//为空格类则赋0
   		break;
   	}
  	p[i]=c0;
      }
      return p;
 }
  
/**
# 总结:
1.malloc(),realloc(),感觉挺难用的,得搭配着free(),没搞明白怎么回事尽量少用。
realloc(p,n)是将指针p所指空间变大(小),变成n,如果所指总空间不够,就会去另外申请一块空间再将原数据拷贝,指针返回。
但是重新分配失败会返回NULL,那么原来p指向的区域就丢失了。
2.说到底,还是多用大范围数组,兜兜转转,不如一个n=1000实用。
**/
输入函数
getchar()//得到一个字符,不过返回int类型;
putchar()//输出一个字符,可以将int a=getchar(), char c=getchar(),然后可以putchar(a),putchar(c),输入“6x”,输出也是“6x”,还可这样输出putchar('\n');
gets()//得到一串字符数组,遇回车停,用于一串含空格的输入;
scanf(%s”,s)//得到一串数组,遇空格类停,感觉一段一段字符串输入不太好用,就感觉有什么地方不对,但又说不出来,学艺不精。

最后

开始想写的有很多,后面又不知道写什么…
是写了一堆注释然后把自己思路打断了吗???

所以,格子衫不喜欢的人分两类?
1. 写代码不加注释的人;
2. 写代码让我加注释的人。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值