动态内存分配数组
程序员文章站
2023-12-26 16:58:09
...
动态输入数组小结+字符输入问题
动态内存分配数组
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,t,d=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++;
t=i%10;
if(t==0) { //分析第一次进入时
//i为10的倍数即10,说明已经用完了10个char,p[0~9],已经赋值
d=i/10;// 第一次进入d=1,第二次d=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 i;
scanf("%s",s);//输入一个字符串,scanf遇空格类停止
i=strlen(s);
p=(char*)malloc(sizeof(char)*(i+1));//申请i+1 char空间
strncpy(p,s,i);//将s前i位赋给p
p[i]=0;//最后一位补0
return p;
}
/*与realloc一起用*/
{
int i;
char *p,*c,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 c=getchar()的c放进括号中,可这样输出putchar('\n');
gets()//得到一串字符数组,遇回车停,用于一串含空格的输入;
scanf(“%s”,s)//得到一串数组,遇空格类停,感觉一段一段字符串输入不太好用,就感觉有什么地方不对,但又说不出来,学艺不精。
最后
开始想写的有很多,后面又不知道写什么…
是写了一堆注释然后把自己思路打断了吗???
所以,格子衫不喜欢的人分两类?
1. 写代码不加注释的人;
2. 写代码让我加注释的人。