C语言动态内存的使用与函数结构体的联合使用

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NAMEMAX
1024//设计一个最大值
typedef struct student_st
{
int id;
char *name;  //定义一个指针用来接收malloc函数返回的内存地址
float math,chinese;
}STU,*STUP;  //定义一个struct student_st类型的结构体变量名称,和一个结构体指针

int stu_input(STU *p) //把结构体的首地址传递过来
{
char name[NAMEMAX];
printf("Please enter for stu:");
scanf("%d%s%f%f",&p->id,name,&p->math,&p->chinese);
if(strlen(name) >= NAMEMAX)//输入的长度值如果超过最大值就结束
return -1;

p->name = malloc(strlen(name)+1);//申请一个刚才输入的name的大小并且加上结束字符(+1)这个字节,把指针返回给
if(p->name == NULL)  //申请内存失败就退出
return -2;
strcpy(p->name,name);
return 0;
}

void stu_display(STU *p)
{
printf("%d %s %f %f\n",p->id,p->name,p->math,p->chinese);
}

int stu_changename(STU *p)
{
char newname[NAMEMAX];
printf("Please enter the newname:");
scanf("%s",newname);
if(strlen(newname) >= NAMEMAX)//如果新输入的名字长度大于最大长度就退出
return -1;
free(p->name); //释放指针P的内存
p->name = malloc(strlen(newname)+1);
if(p->name == NULL)
return -2;
strcpy(p->name,newname);
return 0;
}
void menu(void)
{
printf("\n\n");

printf("--------MENU--------\n");

printf("1 input data\n");

printf("2 display data\n");
printf("3 changname data\n");
printf("\n");
}

int stu_init(STU *p)
{
p->id = 0;
p->math = 0;
p->chinese = 0;
p->name = malloc(1);
if(p->name == NULL)

return -1;

p->name[0] = '\0';
return 0;
}

void stu_destroy(STU *p)
{
free(p->name);
}

int main()
{
STU stu;
int choice;

stu_init(&stu);
/*if error*/

do
{
menu();
printf("Please choice(q for quit):");
if(scanf("%d",&choice) != 1)
break;
switch(choice)
{
case 1:
stu_input(&stu);
break;
case 2:
stu_display(&stu);
break;
case 3:
stu_changename(&stu);
break;
default:
printf("Unknow choice.\n");
continue;
}

}while(1);

stu_destroy(&stu);

exit(0);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值