鱼C论坛

 找回密码
 立即注册
查看: 3268|回复: 9

求救啊c

[复制链接]
发表于 2011-11-5 23:30:40 | 显示全部楼层 |阅读模式

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

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

x
# include <stdio.h>
# include <malloc.h>
#include<stdlib.h>
# define LEN 5

struct student
{
    int age;
    char *name;
    char *sex;
    double score;

}ren[LEN];

void write (struct student ren[LEN]);

void main()

{
    struct student *p;
    int i;

    printf("请输入每个同学的姓名,年龄,性别, 分数\n");
   
    for (i = 0; i < LEN; i++)
    {
        p = (struct student *) malloc (sizeof(struct student));

        printf("姓名:");
        scanf("%s", &p->name);
        getchar();
        
        printf("年龄:");
        scanf("%d", &p->age);
        
        printf("性别:");
        scanf("%s", &p->sex);
        
        printf("分数:");
        scanf("%f", &p->score);         //第一次for输入出现错误;

    }
   
    write(ren);
}   

void write(struct student ren[LEN])

{
    int i;

    FILE *fp;

    fp = fopen ( "test01", "wb" );

    if (fp == NULL)
    {
        printf("文件打开失败!!\n");
        return ;
    }

    for (i = 0; i < LEN; i++)
    {
        fwrite(&ren, sizeof(struct student), 1, fp);
    }
}

为什么啊天啊 ,我把scanf("%lf", p->score)去掉就不会出错了
为什么?????????????????
未命名.jpg

小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-11-5 23:48:20 | 显示全部楼层
我运行了啊。。。没有问题哇
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-11-6 00:58:37 | 显示全部楼层
C-FREE5.0正常。

1. 检查是否杀软干涉
2. 关闭工程文件重新打开试试
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-11-6 08:41:42 | 显示全部楼层
  1. struct student
  2. {
  3.     int age;
  4.     char *name;
  5.     char *sex;
  6.     double score;

  7. }ren[LEN];
复制代码
这里面的name,sex都仅仅是指针,初始化的时候是随机值,并没有指向合法的内存(俗称野指针),你居然敢
  1. for (i = 0; i < LEN; i++)
  2.     {
  3.         p = (struct student *) malloc (sizeof(struct student));

  4.         printf("姓名:");
  5.         scanf("%s", &p->name);
复制代码
那这个 scanf将把数据读到任意内存去,所以有可能出现问题。其它人没出现问题也许是他们今天人品好。建议struct改为如下形式:
  1. struct student
  2. {
  3.     int age;
  4.     char name[20];
  5.     char sex[10];
  6.     double score;

  7. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-11-6 08:43:13 | 显示全部楼层
而且前面即使是像野指针写入也应该是:
  1. scanf("%s", p->name);
复制代码
而不是
  1. scanf("%s", &p->name);
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2011-11-6 17:37:42 | 显示全部楼层
那为什么我将score       doulbe类型改为int 就没有问题了呢???

01.scanf("%s", &p->name); 这样写不行吗???

还有没定义一个指针都要给它们分配内存空间吗???
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2011-11-6 17:40:06 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2011-11-6 17:41:05 | 显示全部楼层
01.scanf("%s", &p->name);

02.scanf("%s", p->name)
有什么区别吗???我试了都可以行的!!
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-11-6 20:45:25 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include<stdlib.h>
  4. #define LEN 2
  5. #define MAX_SIZE 20

  6. struct student
  7. {
  8.     int age;
  9.         //char *name;
  10.     char name[MAX_SIZE];
  11.         //char *sex;
  12.     char sex[MAX_SIZE];
  13.     double score;
  14. }ren[LEN];

  15. void write (struct student ren[LEN]);

  16. void main()
  17. {
  18.     struct student *p;
  19.     int i;

  20.     printf("请输入每个同学的姓名,年龄,性别, 分数\n");
  21.     p = ren;
  22.     //for (i = 0; i < LEN; i++)
  23.         for (i = 0; i < LEN; i++,p++)
  24.     {
  25.         //p = (struct student *) malloc (sizeof(struct student));
  26.         printf("姓名:");
  27.         //scanf("%s", &p->name);
  28.                 scanf("%s", p->name);
  29.         getchar();
  30.         
  31.         printf("年龄:");
  32.         scanf("%d", &p->age);
  33.         
  34.         printf("性别:");
  35.         //scanf("%s", &p->sex);
  36.                 scanf("%s", p->sex);
  37.         
  38.         printf("分数:");
  39.         //scanf("%f", &p->score);         //第一次for输入出现错误;
  40.                 scanf("%lf", &p->score);
  41.     }
  42.     write(ren);
  43. }   

  44. void write(struct student ren[LEN])
  45. {
  46.     int i;
  47.     FILE *fp;
  48.     //fp = fopen ( "test01", "wb" );
  49.         //以文本模式写入你才能检查结果对不对
  50.         fp = fopen ( "test01.txt", "w" );
  51.     if (fp == NULL)
  52.     {
  53.         printf("文件打开失败!!\n");
  54.         return ;
  55.     }
  56.     for (i = 0; i < LEN; i++)
  57.     {
  58.         //fwrite(&ren, sizeof(struct student), 1, fp);
  59.                 fprintf(fp,"age:%d,\tname:%s,\tsex:%s,\tscore:%f\n",
  60.                         ren[i].age,ren[i].name,ren[i].sex,ren[i].score);
  61.     }
  62.         fclose( fp );
  63. }

复制代码
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2011-11-7 22:25:46 | 显示全部楼层
哦知道了
谢谢了啊!!!
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-11-9 07:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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