| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 801 人关注过本帖
标题:结构体指针一问
只看楼主 加入收藏
lixnkei
Rank: 4
来 自:樱之国度
等 级:业余侠客
帖 子:133
专家分:227
注 册:2008-5-13
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:13 
结构体指针一问
请问为何不行呢?我快疯了。


程序代码:
# include <stdio.h>
# include <malloc.h>
   
//函数前置声明
void InputStudent(struct Student ** p, int len);
void OutputStudent(struct Student ** p, int len);
   
//结构体,构建学生结构体
struct Student
{
    int a;
    float b;
    char c[10];
};
   
//主函数
int main(void)
{
    struct Student * p;
    struct Student t;
    int len, i, j;
   
    printf("请输入学生的人数:");
    scanf("%d", &len);
   
    p = (struct Student *) malloc (len * sizeof(struct Student));
   
    //输入
    InputStudent(&p, len);
   
   
    //冒泡排序
    for(i=0; i<len-1; i++)
    {
        for(j=0; j<len-1-i; j++)
        {
            if(p[j].b < p[j+1].b)
            {
                t = p[j];
                p[j] = p[j+1];
                p[j+1] = t;
            }
        }
    }
   
    //输出
    OutputStudent(&p, len); 

    return 0;
}
   
//输入函数
void InputStudent(struct Student ** p, int len)
{
    int i;
   
    for(i=0; i<len; i++)
    {
        printf("请输入第 %d 个学生的信息:\n", i+1);
        printf("年龄:");
        scanf("%d", &(*p[i]).a);
        printf("成绩:");
        scanf("%f", &(*p[i]).b);
        printf("姓名:");
        scanf("%s", (*p[i]).c);     //赋值出错?搞了一天没弄懂
    }
   
    return;
}
   
//输出函数
void OutputStudent(struct Student ** p, int len)
{
    int i;
   
    printf("\n\n学生信息如下:\n");
    for(i=0; i<len; i++)
    {
        printf("第 %d 个学生的信息:\n", i+1);
        printf("年龄: %d ", (*p[i]).a);
        printf("成绩: %f ", (*p[i]).b);
        printf("姓名: %s \n", (*p[i]).c);
    }
   
    return;
}


[ 本帖最后由 lixnkei 于 2010-3-4 17:07 编辑 ]
搜索更多相关主题的帖子: 结构体 
2010-03-04 12:15
林语
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:98
专家分:184
注 册:2009-8-29
收藏
得分:0 
我都是申请一次,输入一次;
那个P[i]好像不行吧,我也不太确定。。。
2010-03-04 13:26
lixnkei
Rank: 4
来 自:樱之国度
等 级:业余侠客
帖 子:133
专家分:227
注 册:2008-5-13
收藏
得分:0 
回复 2楼 林语
我把他都写到主函数是运行没问题的,但我把他分开几个函数来写,就不行了。狂晕呀。


老师说:会写代码的人多如牛毛,但写得很规范的却不多。代码要规范,养成好习惯~!
2010-03-04 14:08
玩出来的代码
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:河南新乡
等 级:贵宾
威 望:11
帖 子:742
专家分:2989
注 册:2009-10-12
收藏
得分:0 
程序代码:
for(i=0; i<len; i++)
    {
        printf("请输入第 %d 个学生的信息:\n", i+1);
        printf("年龄:");
        scanf("%d", (*p[i]).a);
        printf("成绩:");
        scanf("%f", (*p[i]).b);
        printf("姓名:");
        scanf("%s", (*p[i]).c);     //赋值出错?搞了一天没弄懂
    }
i的步长应该是sizeof(struct Student);
scanf("%d ",&(*p[i]).a);  //取地址嘛。

离恨恰如春草,更行更远还生。
2010-03-04 14:15
lixnkei
Rank: 4
来 自:樱之国度
等 级:业余侠客
帖 子:133
专家分:227
注 册:2008-5-13
收藏
得分:0 
回复 4楼 玩出来的代码
加了也不行,人数输入2程序运行没问题,但输入3的话,到第三个学生的赋值时候就出错弹出了。


老师说:会写代码的人多如牛毛,但写得很规范的却不多。代码要规范,养成好习惯~!
2010-03-04 14:49
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
收藏
得分:15 
这样改吧!
程序代码:
//输入函数
void InputStudent(struct Student ** p, int len)
{
    int i;
  
    for(i=0; i<len; i++)
    {
        printf("请输入第 %d 个学生的信息:\n", i+1);
        printf("年龄:");
        scanf("%d", &(**p).a);
        printf("成绩:");
        scanf("%f", &(**p).b);
        printf("姓名:");
        scanf("%s", (**p).c);
        (*p)++;
    }
    while (i>0){(*p)--;i--;}
  
    return;
}
  
//输出函数
void OutputStudent(struct Student ** p, int len)
{
    int i;
  
    printf("\n\n学生信息如下:\n");
    for(i=0; i<len; i++)
    {
        printf("第 %d 个学生的信息:\n", i+1);
        printf("年龄: %d ", (**p).a);
        printf("成绩: %f ", (**p).b);
        printf("姓名: %s \n", (**p).c);
        (*p)++;
    }
  
    return;
}

★★★★★为人民服务★★★★★
2010-03-04 15:12
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
收藏
得分:0 
或者这样改
程序代码:
//输入函数
void InputStudent(struct Student ** p, int len)
{
    int i;
  
    for(i=0; i<len; i++)
    {
        printf("请输入第 %d 个学生的信息:\n", i+1);
        printf("年龄:");
        scanf("%d", &((*p)[i]).a);
        printf("成绩:");
        scanf("%f", &((*p)[i]).b);
        printf("姓名:");
        scanf("%s", ((*p)[i]).c);     //赋值出错?搞了一天没弄懂
    }
  
    return;
}
  
//输出函数
void OutputStudent(struct Student ** p, int len)
{
    int i;
  
    printf("\n\n学生信息如下:\n");
    for(i=0; i<len; i++)
    {
        printf("第 %d 个学生的信息:\n", i+1);
        printf("年龄: %d ", ((*p)[i]).a);
        printf("成绩: %f ", ((*p)[i]).b);
        printf("姓名: %s \n", ((*p)[i]).c);
    }
  
    return;
}

★★★★★为人民服务★★★★★
2010-03-04 15:16
玩出来的代码
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:河南新乡
等 级:贵宾
威 望:11
帖 子:742
专家分:2989
注 册:2009-10-12
收藏
得分:5 
程序代码:
void InputStudent(struct Student ** p, int len)
{
   
    for(int i=0;i<len;i++,)
    {
        scanf("%d",&(*p)[i].a);       
        scanf("%f",&(*p)[i].b);       
        scanf("%s",(*p)[i].c);
       
    }
/*    for(int j=0;j<len;j++,)
    {
        printf("a=%d\n",&(*p[j]).a);
        printf("b=%d\n",&(*p[j]).b);
        printf("c=%d\n",(*p[j]).c);
    }*/
       
   
    return;
}
LS那样改是对的,在函数中p是二级指针与主函数中的指针类型不同,应该在原指针的类型上操作,所以用(*p)一级指针地址再加上i,自动调整为结构大小,得到第二个结构的首地址,这样才能在所申请的空间上操作。

离恨恰如春草,更行更远还生。
2010-03-04 15:47
lixnkei
Rank: 4
来 自:樱之国度
等 级:业余侠客
帖 子:133
专家分:227
注 册:2008-5-13
收藏
得分:0 
喔,终于可以了,万分感谢

[ 本帖最后由 lixnkei 于 2010-3-4 17:01 编辑 ]


老师说:会写代码的人多如牛毛,但写得很规范的却不多。代码要规范,养成好习惯~!
2010-03-04 16:46
玩出来的代码
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:河南新乡
等 级:贵宾
威 望:11
帖 子:742
专家分:2989
注 册:2009-10-12
收藏
得分:0 
程序代码:
# include <stdio.h>
# include <malloc.h>
  
//函数前置声明
void InputStudent(struct Student ** p, int len);
void OutputStudent(struct Student ** p, int len);
  
//结构体,构建学生结构体
struct Student
{
    int a;
    float b;
    char c[10];
};
  
//主函数
int main(void)
{
    struct Student * p;
    struct Student t;
    int len, i, j;
  
    printf("请输入学生的人数:");
    scanf("%d", &len);
  
    p = (struct Student *) malloc (len * sizeof(struct Student));
  
    //输入
    InputStudent(&p, len);
  
  
    //冒泡排序
    for(i=0; i<len-1; i++)
    {
        for(j=0; j<len-1-i; j++)
        {
            if(p[j].b < p[j+1].b)
            {
                t = p[j];
                p[j] = p[j+1];
                p[j+1] = t;
            }
        }
    }
  
    //输出
    OutputStudent(&p, len); 

    return 0;
}
  
//输入函数
void InputStudent(struct Student ** p, int len)
{
    int i;
  
    for(i=0; i<len; i++)
    {
        printf("请输入第 %d 个学生的信息:\n", i+1);
        printf("年龄:");
        scanf("%d", &(*p)[i].a);
        printf("成绩:");
        scanf("%f", &(*p)[i].b);
        printf("姓名:");
        scanf("%s", (*p)[i].c);     //赋值出错?搞了一天没弄懂
    }
  
    return;
}
  
//输出函数
void OutputStudent(struct Student ** p, int len)
{
    int i;
  
    printf("\n\n学生信息如下:\n");
    for(i=0; i<len; i++)
    {
        printf("第 %d 个学生的信息:\n", i+1);
        printf("年龄: %d ", (*p)[i].a);
        printf("成绩: %f ", (*p)[i].b);
        printf("姓名: %s \n", (*p)[i].c);
    }
  
    return;
}
你改了没?,运行上面的程序看看。VC6下。

离恨恰如春草,更行更远还生。
2010-03-04 17:06
快速回复:结构体指针一问
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.130957 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved