C语言 程序出错
程序的功能是输入一个名字然后与结构体中的i对应在用i的值调用结构体中他对应的分数!第一名加5第二名加3第三名加2但我做出来以后无论输入谁的名字f[i].fn对应的都是f[...
程序的功能是 输入一个名字 然后与结构体中的 i 对应 在用 i 的值调用结构体中他对应的分数! 第一名加5 第二名加3 第三名加2 但我做出来以后无论输入谁的名字 f[i].fn对应的都是f[0].fn 我不知道错误出在哪里 (然后第二步 如果输入的不是结构体中的名字 则输出“输入错误,请重新输入 ” 然后再次输入 。 请大佬帮我修改一下我的程序 谢谢 ) void save()//保存运动员信息 {FILE *fp;if((fp=fopen("Athlete information.doc","w"))==NULL){printf("\n不能保存运动员信息\n");return;}fwrite(&i,sizeof(int),1,fp);fwrite(f,sizeof(f[0]),1,fp);} void putin2( )//成绩录入 { int y=1; int flag=0; system("cls"); while(y) { char a,b; int c,r,k=0; printf("请输入运动员姓名:"); scanf("%s",&a); for(i=0;i<20;i++) { if( a ==f[i].fn) r=i; } printf("请输入参赛项目:"); scanf("%s",&b); printf("请输入名次:"); scanf("%d",&c); switch(c) { case 1:k=5+f[r].fn;break; case 2:k=3+f[r].fn;break; case 3:k=2+f[r].fn;break; default:printf("该名次不加分\n");break; } printf("该运动员原分数为:%d",f[r].fn); printf("加分后现分数为:%d\n",k); printf("\n是否继续录入(1.继续;0.退出录入):"); fflush(stdin); scanf("%d",&y); if(y!=1) { y=0; break; } } }
展开
展开全部
从你贴出来的这部分代码来看:
一、你变量i没有在函数中定义,那么是全局变量,小心中途调用其他函数改变i值。
二、char a; int c;这样的定义变量语句不要写在循环里面,这样写重复定义。
三、姓名这样的字符串储存要定义对应大小字符串,不要只定义1字节字符变量,char a;这样&a可以被认为字符串首地址,但大小只有1字节,你后面内容全部访问越界。
四、变量r是在找到对应名字的时候才赋值,而且没有给初值,那么第一次一旦找不到对应名字,后面r就是一个随机值。所以我建议每次循环给个初值-1,这样可以判断有没有找到。
下面是根据你源码修改后代码,修改处有标记。(只针对你贴出来的代码,其他文件写入之类无关):
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <string.h>
struct sein
{
long int num;
char name2[10];
char project[10];
char name3[10];
char gender[10];
int age;
char ge[10];
int rg;
int fn;
}f[100]={
{101,"小曹","100米跑","XX学院","男",18,"A",1,9},
{102,"小王","跳远","XX学院","男",18,"A",2,2},
{103,"小张","跳远","XX学院","男",18,"A",3,3},
{104,"小赵","足球","SS学院","女",18,"A",4,4},
{105,"小蔡","50米跑","SS学院","女",18,"B",5,5},
{106,"小徐","1000米跑","FF学院","女",18,"B",6,6},
{107,"小坤","篮球","CC学院","男",18,"A",7,7}
};
void save();//保存运动员信息
void putin2();//成绩录入
int i;
int main()
{
putin2();
return 0;
}
void save()//保存运动员信息
{
FILE *fp;
if((fp=fopen("Athlete information.doc","w"))==NULL)
{
printf("\n不能保存运动员信息\n");
return;
}
fwrite(&i,sizeof(int),1,fp);
fwrite(f,sizeof(f[0]),1,fp);
}
void putin2()//成绩录入
{
int y=1;
int flag=0;
system("cls");
char a[10],b[10];//!!!!!!!!!!!!!!!!!!!!!!!!!改动
int c,r,k;//!!!!!!!!!!!!!!!!!!!!!!!!!!!改动
while(y)
{
r=-1,k=0;//!!!!!!!!!!!!!!!!!!!!!!!!!改动
printf("请输入运动员姓名:");
scanf("%s",a);//!!!!!!!!!!!!!!!!!!!!!!!!!!!!改动
for(i=0;i<20;i++)
{
if(!strcmp(a,f[i].name2))
{
r=i;
break;
}
}
if(r!=-1)//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!改动(用这个判断把下面代码套起来,没找到对应名字不执行下面加分判断,否则会越界)
{
printf("请输入参赛项目:");
scanf("%s",b);//!!!!!!!!!!!!!!!!!!!!!!!!!!!!改动
printf("请输入名次:");
scanf("%d",&c);
switch(c)
{
case 1:k=5+f[r].fn;break;
case 2:k=3+f[r].fn;break;
case 3:k=2+f[r].fn;break;
default:printf("该名次不加分\n");
break;
}
printf("该运动员原分数为:%d",f[r].fn);
printf("加分后现分数为:%d\n",k);
}
else
printf("姓名不存在!!!!\n");
printf("\n是否继续录入(1.继续;0.退出录入):");
fflush(stdin);
scanf("%d",&y);
if(y!=1)
{
y=0;
break;
}
}
}
展开全部
这个代码需要重写。比如函数putin2中,声明的a是char型字符,后面scanf中却要让它接收一个姓名字符串,这样的错误说明代码构思很混乱,不是略改一下就能解决的……
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2019-06-08
展开全部
putin2函数中
char a;应该为一个字符串改为char a[100];
字符串a应该与运动员名字比较,也就是a与结构体的name2字段比较。a==f[i].fn改为strcmp(a,f[i].name2)。strcmp函数需要添加string.h头文件。
更多追问追答
追问
按照您的方法改了 可以F[r].fn,读取的还是 f[0].fn 无论输入谁的名字都是一样的
追答
strcmp函数如果两个字符串是一样的,返回的应该是0,改为0==strcmp(a,f[i].name2)试试。
如果还是不行可以把完整代码发给我。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
C语言定义结构体时是不能这样赋值的。这个是语法错误。你应该按照课本内容,先定义好结构体。后面再对结构体变量赋值。
追问
对 我也感觉是结构体错了 但是不知道怎么改
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
那个平台做的
更多追问追答
追问
dev c++
追答
还没搞定啊
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询