求c语言编程达人帮忙指点下

实现一个简单的问题:输入学生信息(只写姓名就行),要求用到动态内存分配(malloc)开辟存储空间,当输入人数超过8个人时,要求继续开辟动态内存空间,将之前输入的8个人放到新的空间内,超过8个人的部分按顺序在其后存入。依次类推,超过16个人、24个人等都如此,要求用到循环实现。最后要统计输入学生的个数。请大家帮忙码一下,不胜感激!

这个问题的思想比较像C++里面的vector容器

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

int main()
{
    int capacity = 8, size = 0;
    char name[10];
    char **student = (char**)malloc(capacity*sizeof(char*));

    while (scanf("%s", name))
    {
        if (name[0] == '0') //输入0结束
            break;
        char *str = (char*)malloc(strlen(name)*sizeof(char));
        strcpy(str, name);
        if (capacity == size)
        {
            capacity += 8;
            char **p = (char**)malloc(capacity*sizeof(char*));
            for (int i = 0; i < size; ++i)
                p[i] = student[i];
            p[size++] = str;
            free(student);
            student = p;
        }
        else
            student[size++] = str;
    }

    printf("%d %d\n", capacity, size);
    for (int i = 0; i < size; ++i)
        printf("%s ", student[i]);
    return 0;
}

追问

噢!有思路了,待我再加入学生的性别年龄生日等完善下。谢了

温馨提示:内容为网友见解,仅供参考
第1个回答  2014-12-10
用relloc()函数会更好一些吧,正好解决了你这种情况(需要不断动态分配)追问

是不是大概这个样子,realloc(p,n*N),其中N=8,n随你输入情况适时n++?

追答

只要新申请的内存空间比之前的内存空间大就可以,
这里可以realloc( point , n*N*sizeof( struct student) ),保证n递增就可以

追问

谢谢,太有帮助了!

C语言编程题,都是基础的,望达人解答。
1.main(){ int a,b;scanf("%d%d",&a,&b);printf("a+b=%d",a+b);} 2.main(){ int a,b;scanf("%d%d",&a,&b);if(a>b)printf("最小值是%d",b);if(a<b)printf("最小值是%d",a);if(a==b)printf("两个值相等");} 3.main(){ int a,b;scanf("%d%d",&a,&b)...

求c语言编程达人帮忙指点下
i < size; ++i) p[i] = student[i];

c语言编程,达人救我
int main(){ int n;while(scanf("%d",&n)!=EOF){ if(n>=0&&n<=86399)Dis(n);} return 0;}

关于C编程的问题 请各位达人帮忙 谢谢
第一个:include "stdio.h"main(){ int max=0,min=0,a[3],i;printf("Please input 3 numbers:\\n");for(i=0;i<3;i++){ scanf("%d",&a[i]);} max=a[0]>a[1]?a[0]:(a[1]>a[2]?a[1]:a[2]);min=a[0]<a[1]?a[0]:(a[1]...

求助C语言达人:编程输出100到200间能被7整除的整数,要求每行输出5个数...
先从100开始增1寻求第一个被7整除的数,然后从这个数开始增7逐一输出,直到大于200停止。另用一变量从0开始每输出一个数增1,能被5整时增加输出一个回车就能满足题目要求。代码如下:include "stdio.h"int main(int argc,char *argv[]){int i,t;for(i=100;i%7;i++);\/\/从100开始增1穷举...

C语言编程达人请进
,1,fp);sizeof(int)表示你写入的一块的大小,你用的是一个int大小。1表示你要写入的块的数目。显然在你机器上一个int是4个字节,而arr的类型是char *,一个char是1个字节,所以你写入4个字节大小的数据时就会写入四个字符。如果你要写入全部字符,改成 fwrite(&arr,sizeof(char),10,fp);...

悬赏,急。编程达人请进。帮帮忙解释一下这个C语言数据结构的函数的思...
1、定义新链表c,用于存放结果 2、取多项式a的头结点qa,qa->next为a的第一项。3、对b进行同样操作得到b第一项地址qb->next。4、a的每一项与b的每一项都做运算,两个多项式相乘的结果存入c while(qa->next != 0)\/\/遍历a { while(qb->next != 0)\/\/遍历b { 系数相乘 幂相加 存入c...

C语言的怎样编程啊?
编程的东西太多了,我就说scanf,printf吧。1.首先要应用这两个函数就要导入一个包所以要在前面加一个宏定义#include<stdio.h> 2.然后就是写一个main函数这是程序的入口void main(){} 3.要输入的话,首先的定义一个变量来存储你输入的东西。如int no;或char name[20];然后写一个输入函数,scanf...

这儿有一道C语言编程题,请达人帮忙看一下有什么错误。
n每步循环的开始,要把相关变量清0 for(n=3;n<=20;n++){ \/\/以下是将相关变量清0 i=j=flag=0;for(p=0;p<21;p++)for(q=0;q<21;q++)a[p][q]=0;for(curr=1;curr<=n*(n+1)\/2;curr++){

请编程达人用c语言编写一个程序输出魔方阵
int main(){ int a[N][N],i,j,k,p,m,n;p=1;while(p==1) \/*要求阶数为1~15的商数*\/ { printf("Enter n(n=1~15):"); \/\/可以输入小于等于N-1的整数 scanf("%d",&n);if((n!=0)&&(n<=N-1)&&(n%2!=0)) p=0;} for(i=1;i<=n;i++) \/*初始化*\/ for(j...

相似回答