鱼C论坛

 找回密码
 立即注册
查看: 2952|回复: 5

紧急求助!关于结构体的!!

[复制链接]
发表于 2012-6-12 10:45:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 螃蟹009 于 2012-6-12 11:01 编辑
  1. # include <stdio.h>
  2. # include <malloc.h>

  3. struct student
  4. {
  5.         char name[100];
  6.         int age;
  7.         float score;
  8. };

  9. void  Scanf(struct student ** pArry, int len)
  10. {
  11.         int i;        
  12.         for (i=0; i<len; i++)                                                        
  13.         {
  14.                 printf ("第%d个学生的姓名:", i+1);
  15.                 scanf ("%s", (*pArry).name);
  16.                 printf ("\n");
  17.                 printf ("第%d个学生的年龄:", i+1);
  18.                 scanf ("%d", &(*pArry).age);
  19.                 printf ("\n");
  20.                 printf ("第%d个学生的成绩:", i+1);
  21.                 scanf ("%f", &(*pArry).score);
  22.                 printf ("\n");
  23.         }
  24. }

  25. void  Printf (struct student ** pArry, int len)
  26. {
  27.         int i;        
  28.         for (i=0; i<len; i++)                                                      
  29.         {
  30.                 printf ("第%d个学生的姓名:", i+1);
  31.                 printf ("%s", (*pArry).name);        
  32.                 printf ("\n");
  33.                 printf ("第%d个学生的年龄:", i+1);
  34.                 printf ("%d", (*pArry).age);
  35.                 printf ("\n");
  36.                 printf ("第%d个学生的成绩:", i+1);
  37.                 printf ("%f", (*pArry).score);
  38.                 printf ("\n");
  39.         }
  40. }
  41. int main(void)
  42. {
  43.         int i;
  44.         int len;
  45.         printf ("请输入学生的人数\n");
  46.         scanf ("%d", &len);
  47.         
  48.         struct student * pArry = (struct student *)malloc(len * sizeof(int));

  49. Scanf (&pArry, len);
  50.         
  51.         printf("**************************\n");
  52.         printf("学生的情况如下\n");
  53.         printf("**************************\n");
  54.         
  55.         Printf(&pArry, len);

  56.         printf("**************************\n\n");
  57.         printf("**************************\n");
  58.         
  59.         return 0;
  60. }
复制代码
这是我写的学生数据管理系统的最基本版本!有个问题还是不太清楚!
  1. void Scanf(struct student ** pArry, int len)
  2. {
  3. int i;
  4. for (i=0; i<len; i++)
  5. {
  6. printf ("第%d个学生的姓名:", i+1);
  7. scanf ("%s", (*pArry).name);
复制代码
这里面的printf ("%s", (*pArry).name);中如果说因为name[100]是数组,而name是数组名而不用加&的话
  1. scanf ("%s", &(*pArry).name);
复制代码

  1. void Printf (struct student ** pArry, int len)
  2. {
  3. int i;
  4. for (i=0; i<len; i++) /
  5. {
  6. printf ("第%d个学生的姓名:", i+1);
  7. printf ("%s", (*pArry).name);
  8. printf ("\n");
  9. printf ("第%d个学生的年龄:", i+1);
  10. printf ("%d", (*pArry).age);
  11. printf ("\n");
  12. printf ("第%d个学生的成绩:", i+1);
  13. printf ("%f", (*pArry).score);
  14. printf ("\n");
  15. }
  16. }
复制代码
中为什么是这么输出的?
  1. printf ("%s", (*pArr y).name);
复制代码
这样不是地址的吗??
还有我一开始认为定义的函数应该是struct student 类型的,比如
  1. struct student Printf (struct student ** pArry, int len)
复制代码
可是却有一个错误!!好像数返回值的问题!不是很清楚到底为什么!
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-6-15 02:31:54 | 显示全部楼层

回帖奖励 +2 鱼币

输出字符串时候 都是这样的  比如 char *p="I love you!";
输出的时候就是 Printf("%s",p);  不需要在p的前面加上*符号   如果是 整形  数值之类的 就必须加上*符号了
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-6-16 02:49:44 | 显示全部楼层
楼主。。。首先帮你解释下字符串问题。对于字符串,是以字符数组的形式从在,EG:char string[10], 当你用scanf给这个字符数组赋值的时候,可以scanf("%s",string); 也可以gets(string), C里面支持这样的,仅限于字符串。当然输出的时候也一样printf("%s",string),或者puts(string), 需要注意的是,对于字符串,在被赋值完毕以后,系统会自己在字符串后面添加一个字符串结束标示符‘\0’,对应的编码是0,作为字符串的结束标记,所以输出的时候就以这个作为结束标志,;来实现一次性输出。  *string 相当于string[0]  是字符串的第一元素。也就是第一个字符。  结构体都是浮云,不用纠结。。。  

下面说你的函数返回值问题,对于你自定义的函数,你想要他返回什么结果,你就定义需要的类型,就像你上面写的那个函数,其实本来就不需要返回值,只是实现了一个功能,当然你可以定义成 一个整形
int Pintf(。。。) 功能实现返回非0值,或者1,没实现返回0.。这样,当然返回值是你自己定义的,想怎么定义就怎么定义,但是 你定义的返回值类型要跟你函数内部返回的类型一致,还有跟主调函数接收返回值的变量的类型一致。。。
楼主加油!
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-6-16 07:47:52 | 显示全部楼层
本帖最后由 酷逸 于 2012-6-16 07:54 编辑

输出字符串的问题的话,因为字符是作为一连串存储的,所以输入或者输入都只需要数组的首地址(其实也就是第一个元素的指针)
好比说你要用的数组是a[100] 定义一个指针char* p=a[0];  那么不管你是用scanf("%s",a)或者scanf("%s",p)都能得到正确的结果,printf也是一样


定义成truct student Printf (struct student ** pArry, int len)的话
就需要返回一个student类型的数据 既然只是一个输出函数,不需要返回值,所以应该是void


小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-6-16 12:38:30 | 显示全部楼层

a[100]     char * p=a[0]  ???????????????????????????????????楼上不认真 这样会误导新人的。。。

应该是 char * p=&a[0]  或者  char *p =a;
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-6-16 22:31:49 | 显示全部楼层
Tzdner_C 发表于 2012-6-16 12:38
a[100]     char * p=a[0]  ???????????????????????????????????楼上不认真 这样会误导新人的。。。

...

sorry 确实没注意。应该是想打p=a的
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-13 17:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表