免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3810 | 回复: 14
打印 上一主题 下一主题

这个C文件到底出错在哪里,编译时gets函数接受参数过多,还是…… [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-04-16 17:00 |只看该作者 |倒序浏览
编译时卡在gets处,提示参数过多,如何修改通过编译,请各位高人帮帮看看。。谢谢了。
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <conio.h>
  5. #define STMAX 100  /*最大学生数*/

  6. struct student
  7. {
  8. char id[10];
  9. char name[20];
  10. char sex[10];
  11. float sorc[3];
  12. float aver;
  13. float sum;
  14. };

  15. FILE * fp=NULL;
  16. char filename[]="c:\\学生信息表.dat"; /*录入的学生信息所存储的文件*/

  17. /***************************函数声明**********************/
  18. void showmenu();
  19. void inputinfo(struct student*);
  20. void aboutinfo(struct student*);
  21. void allinfo(struct student*);
  22. void delinfo(struct student*);
  23. int existRec(struct student*);

  24. /**********主函数***********/

  25. int main(int argc, char *argv[])
  26. {
  27.         struct student studentInfo[STMAX];
  28.         struct student * p_student;
  29.         int choice;
  30.         p_student=studentInfo;

  31.         /*********************显示菜单************************/
  32.         showmenu();   /*显示系统菜单*/
  33.         printf("\t\t 请选择操作:");
  34.         /*********************输入选项********************/
  35.         scanf("%d",&choice);
  36.         /***************如果输入错误是否退出*************/
  37.         while(choice!=5);
  38.           {
  39.                   /********调用相应的功能*******/
  40.             switch(choice)
  41.                         {
  42.                         case 1:inputinfo(p_student);break;
  43.                         case 2:aboutinfo(p_student);break;
  44.                         case 3:allinfo(p_student);break;
  45.                         case 4:delinfo(p_student);break;
  46.                         case 5:break;
  47.                         default:printf("\n\t\t\ 请重新选择(1~5):");
  48.                                 scanf("%d",&choice);
  49.                         //        continue;
  50.                         }
  51.                 showmenu();
  52.                 printf("\t\t 请选择操作:");
  53.             scanf("%d",&choice);
  54.                 }
  55.           printf("\n\n\t\t 退出系统");

  56.        
  57. }


  58. /**************显示系统菜单******************/
  59. void showmenu()
  60. {
  61.   system("cls");   //清屏
  62.   printf("\n\n\n");
  63.   printf("\t\t------------------------------------------------\n");
  64.   printf("\t\t|           学生信息管理系统                    |\n");
  65.   printf("\t\t------------------------------------------------\n");
  66.   printf("\t\t|           1.   录入信息                       |\n");
  67.   printf("\t\t|                                               |\n");
  68.   printf("\t\t|           2.   查询信息                       |\n");
  69.   printf("\t\t|                                               |\n");
  70.   printf("\t\t|           3.   浏览信息                       |\n");
  71.   printf("\t\t|                                               |\n");
  72.   printf("\t\t|           4.   删除信息                       |\n");
  73.   printf("\t\t|                                               |\n");
  74.   printf("\t\t|           5.   退出系统                       |\n");
  75.   printf("\t\t------------------------------------------------\n");
  76.   //return();
  77. }

  78. /***********计算文件中现有的记录数****************/
  79. int existRec(struct student * p_student)
  80. {
  81.   int count;
  82.   system("cls");
  83.   /*******打开文件***************/
  84.   /*******是否出错***************/
  85. if((fp=fopen(filename,"rb"))==NULL)
  86.         {
  87.          /***************报告错误信息****/
  88.         printf("不能打开文件,请确认磁盘未满或c:\\学生信息表.dat文件没有损坏");
  89.         exit(0);
  90.          }
  91. rewind(fp);
  92. /***********读入一条记录*************/
  93. /***********是否成功*****************/
  94. for(count=0;fread(&p_student[count],sizeof(struct student),1,fp)==1;count++);
  95. /***********关闭文件*******************/
  96. fclose(fp);
  97. return count;

  98. }

  99. /**********************信息录入*****************/
  100. void inputinfo(struct student *p_student)
  101. {
  102.   int count,j;
  103.   char ch;
  104.   float sum;
  105.   /*******************打开文件****************/
  106.   count=existRec(p_student);
  107.   /***************是否出错****************/
  108.   if((fp=fopen(filename,"a+b"))==NULL)
  109.    /********************报告错误***************/
  110.           {
  111.           printf("不能打开文件,请确认文件存在!");
  112.           exit(0);
  113.           }
  114.         /**********************录入学生信息*******************/
  115.   printf("\n\t 信息登记表\n");
  116.   printf("\n请输入第%d个学生的信息(请使用英文或拼音)\n",count+1);
  117.   printf("-----------------------------------------");
  118.   printf("\n 学号:");

  119.   fflush(stdin);  /*清楚缓存,保证 scanf 输入正确*/
  120.   /****************学号为0****************************/
  121.   while(count<STMAX&&gets(p_student[count].id)!=NULL&&p_student[count].id[0]!='\0')
  122.           {
  123.           printf("\n学号");
  124.           gets("%s",p_student[count].id);
  125.           printf("\n姓名");
  126.           gets("%s",p_student[count].name);   /*
  127.                                                *用gets时提示参数太多,只能接受一个输入参数
  128.                                                *如何解决?问题点。
  129.                                                                                   */
  130.           printf("\n性别");
  131.           gets("%s",p_student[count].sex);
  132.           printf("\n英语成绩:");
  133.           gets("%f",&p_student[count].sorc[0]);     //gets函数在接受非字符串时,必须用&符号
  134.           printf("\n高数成绩:");
  135.           gets("%f",&p_student[count].sorc[1]);
  136.           printf("\n计算机成绩:");
  137.           gets("%f",&p_student[count].sorc[2]);
  138.           printf("----------------------------------\n");
  139.           /***************************计算成绩*********************/
  140.           sum=0;
  141.           for(j=0;j<3;j++)
  142.            sum=sum+p_student[count].sorc[j];   //计算总分 最好写成 sum+=p_student[count].sorc[j]
  143.            p_student[count].sum=sum;
  144.            p_student[count].aver=sum/3.0;     //计算平均分
  145.            /************************下面开始存入数据文件*************************/
  146.            fwrite(&p_student[count++],sizeof(struct student),1,fp);

  147.            printf("\n是否写入第%d个学生的信息(y/n)",count+1);
  148.            ch=getch();
  149.            if(ch=='y'||ch=='Y')
  150.                   {
  151.                     printf("%c\n--------------------------------",ch);
  152.                         printf("\n 学号:");
  153.                         fflush(stdin);
  154.                         continue;
  155.                   }
  156.            else
  157.                    {
  158.                    fclose(fp);
  159.                    printf("%c\n\n 信息录入结束,按任意键返回!",ch);
  160.                    getch();
  161.                    //system("cls");
  162.                    return;
  163.                    }
  164.           }
  165.   fclose(fp);
  166.   printf("\n输入有误,终止信息录入,按任意键返回!");
  167.   getch();
  168.   return;
  169. }

  170. /****************************查询个人信息******************************/
  171. void aboutinfo(struct student *p_student)
  172. {
  173.   int i;
  174.   int count;
  175.   char ch;
  176.   char * temp=NULL;
  177.   
  178.   count=existRec(p_student);
  179.   if(!count)
  180.         {
  181.         printf("\n文件中记录为空!");
  182.         getch();
  183.         return;
  184.         }
  185.   temp=(char*)malloc(10*sizeof(char));
  186.   printf("\n请输入要查询的学生学号:");
  187.   fflush(stdin);
  188.   while(gets(temp)!=NULL&&temp[0]!='\0')
  189.         {
  190.           for(i=0;i<count;i++)
  191.            {
  192.            if(!strcmp(temp,p_student[i].id))
  193.             {
  194.              printf("------------------------------\n");
  195.              printf("姓名:%s\n",p_student[i].name);
  196.                  printf("\n性别:%s\n",p_student[i].sex);
  197.              printf("\n英语:%.2f\n",p_student[i].sorc[0]);
  198.              printf("\n高数:%.2f\n",p_student[i].sorc[1]);
  199.              printf("\n计算机:%.2f\n",p_student[i].sorc[2]);
  200.              printf("\n总分:%.2f\n",p_student[i].sum);
  201.              printf("\n平均分:%2f\n",p_student[i].aver);
  202.              printf("------------------------------\n");
  203.              break;
  204.                 }
  205.            }
  206.      if(i==count)
  207.        printf("\n没有该学生!\n",ch);
  208.        printf("\n 查询下一个学生的信息?(y/n)");
  209.      ch=getch();
  210.      if(ch=='y'||ch=='Y')
  211.       {
  212.           printf("%c\n\n 请输入要查询的学生学号:",ch);
  213.           fflush(stdin);
  214.           continue;
  215.           }
  216.      else
  217.       {
  218.           free(temp);
  219.           printf("%c\n\n 查询结束,返回!",ch);
  220.           getch();
  221.           return;                         
  222.           }
  223.         }
  224.   free(temp);
  225.   printf("\n 输入有误,按任意键返回菜单!");
  226.   getch();
  227.   return;
  228. }


  229. /*************查询所有信息*****************/
  230. void allinfo(struct student * p_student)
  231. {
  232.   int i;
  233.   int count;
  234.   count=existRec(p_student);
  235.   if(!count)
  236.    {
  237.    printf("\n\n 文件记录为空!");
  238.    getch();
  239.    return;   
  240.    }            
  241.   printf("\n\t\t\t 学生信息查询表\n\n");
  242.   printf("\t 以下是本系统所查询到的所有学生信息,如果表中数据为空\n");
  243.   printf("\t 请确认数据是否成功录入!\n");
  244.   printf("\n----------------------------------------------------");
  245.   for(i=0;i<count;i++)
  246.   {
  247.    printf("\n 您正查看第[%d]个学生的信息\n",i+1);
  248.    printf("\n学  号:%s\n",p_student[i].id);
  249.    printf("\n姓  名:%s\n",p_student[i].name);
  250.    printf("\n性  别:%s\n",p_student[i].sex);
  251.    printf("\n英  语:%.2f\n",p_student[i].sorc[0]);
  252.    printf("\n高  数:%.2f\n",p_student[i].sorc[1]);
  253.    printf("\n计算机:%.2f\n",p_student[i].sorc[2]);
  254.    printf("\n总  分:%.2f\n",p_student[i].sum);
  255.    printf("\n平均分:%2f\n",p_student[i].aver);
  256.    printf("------------------------------\n");
  257.    printf("按任意键继续浏览……!");
  258.    getch();
  259.   }
  260.   printf("\n\n 查询结束,按任意键返回!");
  261.   getch();
  262.   return;          
  263. }

  264. /****************删除信息*********************/
  265. void delinfo(struct student * p_student)
  266. {
  267. int i,j;
  268. int count;
  269. char ch;
  270. char* temp=NULL;
  271. count=existRec(p_student);
  272. if(!count)
  273.   {
  274.   printf("\n 不能读取数据,请确认已经正确录入或数据是否存在");
  275.   getch();
  276.   return;  
  277.   }
  278. temp=(char*)malloc(10*sizeof(char));
  279. printf("\n 请输入要删除的学生学号:");
  280. fflush(stdin);

  281. while(gets(temp)!=NULL&&temp[0]!='\0')
  282. {
  283.   for(i=0;i<count;i++)
  284.   {
  285.     if(!strcmp(temp,p_student[i].id))
  286.      {
  287.           printf("\n\n 确定要删除%s的信息吗? (y/n)",p_student[i].id);
  288.           ch=getch();
  289.           if(ch=='n'||ch=='N')
  290.            {
  291.            free(temp);
  292.            printf("%c\n\n 该操作被取消,请按任意键返回!",ch);
  293.            getch();
  294.            return;          
  295.            }
  296.      for(j=i;j<count;j++)
  297.        p_student[j]=p_student[j+1];  //从数组中删除指定学生
  298.      count--;
  299.          if((fp=fopen(filename,"w+b"))==NULL)
  300.       {
  301.             free(temp);
  302.             printf("\n不能打开文件,请确认磁盘已满或文件是否存在");
  303.                 getch();
  304.                 exit(1);
  305.           }
  306.            for(j=0;j<count;j++)
  307.            {
  308.             if(fwrite(&p_student[j],sizeof(struct student),1,fp)!=1)
  309.             break;
  310.            }
  311.            fclose(fp);
  312.          }
  313.    }
  314.   if(i==count)
  315.    printf("\n\n没有该学生!\n",ch);
  316.   else
  317.   printf("%c\n\n\n 已成功删除该学生的信息……\n",ch);
  318.   printf("\n删除下一个学生信息 (y/n)");
  319.   ch=getch();
  320.   if(ch=='y'||ch=='Y')
  321.    {
  322.    printf("%c\n\n 请输入你要删除的学生学号:",ch);
  323.    fflush(stdin);
  324.    continue;
  325.    }
  326.    else
  327.    {
  328.    free(temp);
  329.    printf("%c\n\n 删除结束,按任意键返回!",ch);
  330.    getch();
  331.    return;
  332.    }
  333. }
  334. free(temp);
  335. printf("\n 输入有误, 请按任意键返回菜单,重新选择!");
  336. getch();
  337. return;
  338. }
复制代码

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2012-04-16 17:02 |只看该作者
改成 scanf

论坛徽章:
0
3 [报告]
发表于 2012-04-16 17:05 |只看该作者
我改成scanf后,编译通过,但是接受showmenu 选择 任一 数字 进入相关菜单时,程序就停止响应了。

不知道问题出在哪里了。。能帮忙继续看看否?谢谢。

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
4 [报告]
发表于 2012-04-16 17:42 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
5 [报告]
发表于 2012-04-16 17:53 |只看该作者
请教如何解决嘛,谢谢了。

论坛徽章:
23
双鱼座
日期:2013-08-30 09:25:19辰龙
日期:2014-07-28 11:22:24白羊座
日期:2014-08-26 10:34:1815-16赛季CBA联赛之浙江
日期:2016-03-15 10:51:5415-16赛季CBA联赛之八一
日期:2016-05-31 09:38:3615-16赛季CBA联赛之辽宁
日期:2017-08-31 14:59:2115-16赛季CBA联赛之辽宁
日期:2017-12-06 14:12:3615-16赛季CBA联赛之天津
日期:2019-01-02 15:25:4915-16赛季CBA联赛之深圳
日期:2020-12-06 11:26:21狮子座
日期:2014-05-19 09:16:35技术图书徽章
日期:2014-03-27 13:37:39技术图书徽章
日期:2013-08-30 09:28:52
6 [报告]
发表于 2012-04-17 09:28 |只看该作者
没有细看,新人路过,帮顶

菜单选择项的输入你可以用getch这个接收单字符,不回显的函数啊,若是要用scanf输入(你后面又有
getch)的话,就会出现回车符“吃不掉”的问题,处理起来又麻烦。

gets的用法:
  1. char *gets(char *s);

  2. fgets() reads in at most one less than size characters from stream and stores them into the  buffer  pointed
  3.        to  by  s.  Reading stops after an EOF or a newline.  If a newline is read, it is stored into the buffer.  A
  4.        '\0' is stored after the last character in the buffer.
复制代码
PS:你这是TC程序还是VC程序,记得getch这个函数两者有差别。

论坛徽章:
0
7 [报告]
发表于 2012-04-17 10:31 |只看该作者
dev c++ 编译的 4.9.9的版本。 之前没发帖的时候是将 输入改成scanf的,但在菜单选择的时候,提交就没有响应了。 所以发过来让大家看看。

这个例子是 清华大学出版社 出版的一本叫《程序设计基础-C语言版》 作者 高克宁。
最后的例子是这个,我抄录了一遍,刚开始编译的时候错误很多,改了一些,还是有错误。
书中没提到 该例子原来的编译环境。  我是在dev c中编译的。

能帮忙看看问题出在哪里了否,也是刚学习,有点混乱了:)

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
8 [报告]
发表于 2012-04-17 10:46 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
9 [报告]
发表于 2012-04-17 11:16 |只看该作者
好几本书一起翻:
1> C和指针
2> C程序设计语言英文版的书+中文版的chm

加上这本 程序设计基础-c语言版 高克宁
借鉴和比较的看,主要参考 1和2 。

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
10 [报告]
发表于 2012-04-17 11:22 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP