我是C的新手,我不知道为什么我的扫描功能会出现冲突类型错误。我们将非常感谢您提供解决方案或任何改进我的代码的建议。分配方向如下所示。
您的程序应该读取包含该文件的文件的信息 器官等待名单,以及收到的一系列器官 捐款。对于收到的每个器官,你的程序应打印出来 他们收到的人的姓名和器官。器官应该 去找候补名单上最长的人,是谁 管风琴的比赛。出于本作业的目的,匹配 当供体器官与供体的血型相同时发生 与收件人相同。一旦发现器官匹配,他们 不应该再次匹配。
输入文件格式
输入文件的第一行将包含一个正整数n(n≤120000),表示等待列表中的器官数。接下来的n行将包含信息 每个约一个器官。这些行中的每一行都包含该人 名称,他们需要更换的器官,他们的血型,他们的日期 被添加到器官数据库和它们被添加到的时间 器官数据库。这些项目中的每一项都将以空格分隔。所有 名称将仅由字母和下划线组成,所有器官 名称将被比较为小写字母,所有血型都将是 前面提到的8个字符串之一,所有日期都是 格式为m / d / y,其中m,d和+ y表示数字月份日和 一年,患者被添加到器官捐献清单(为此 特别器官)。最后,时间将是hr:min,其中 hr(0≤hr≤23)和min(0≤min≤59)表示数字小时和 将患者加入器官捐献清单的时间。 你可以保证没有两个器官被添加到列表上 相同的日期和时间,没有名称或器官名称将包含更多 超过19个字符。
输入文件的以下行(行号n + 2)将包含一个 单正整数,k(k≤1000)表示数 在一段固定的时间内收到的器官。以下k 线条将包含有关收到的器官的信息 他们被收到了。这些行中的每一行都包含两个字符串 由空格隔开:器官的名称和血液的类型 捐赠者。这些都符合之前给出的规范。
输出规范
为收到的每个器官输出一行。如果数据库中存在尚未收到管风琴的匹配收件人,请打印出收件人的姓名,然后打印出来 他们收到的器官。如果数据库中不存在匹配项,则打印输出 以下是一行。
No match found
示例输出:
Adam_Smith kidney Jessica_Arte liver Shelly_Zenith liver No match found No match found John_Lynch kidney
示例输入:
10 John_Lynch kidney A- 12/13/2007 14:43 Beth_Silva lung O+ 1/23/2009 13:10 Adam_Smith kidney A- 12/13/2007 9:59 Jenn_Gray liver AB+ 9/9/1999 1:23 Sylvia_Maria lung O+ 1/24/2009 0:09 Sean_Stark heart AB- 8/23/2000 9:13 Shelly_Zenith liver AB- 9/10/1999 1:13 Jessica_Arte liver AB+ 8/31/1999 23:38 Bill_Muse heart O+ 3/23/2013 3:12 Samantha_Bogedon intestine B- 6/30/2012 17:08 6 kidney A- liver AB+ liver AB- heart O- intestine A+ kidney A-
代码:
#include <stdio.h>
#include <stdlib.h>
#define SIZE 20
#define BLOODTYPESIZE 4
//Structure to store month day and year
typedef struct {
int month;
int day;
int year;
} dateT;
// Structure to stores hour and minute
typedef struct {
int hour;
int minute;
} timeT;
// structure to store name organname bloodtype dateadded time added and whether or not it was received
typedef struct {
char name[SIZE];
char organname[SIZE];
char bloodtype[BLOODTYPESIZE];
dateT dateAdded;
timeT timeAdded;
int received;
} organT;
int main(){
//Declare variables
int numberOfOrgans,x,numberOfDonors,y,match,possible;
// Create pointer to structure
organT* organ;
scanf("%d",&numberOfOrgans);
organ = (organT *)malloc(numberOfOrgans*sizeof(organT));
scanOrgans(numberOfOrgans,organ);
scanf("%d",&numberOfDonors);
organT* donors;
donors = (organT *)malloc(numberOfDonors*sizeof(organT));
scanDonors(numberOfDonors, donors);
for(y=0;y<numberOfDonors;y++){
match=-1;
possible=-1;
for(x=0;x<numberOfOrgans;x++){
if((strcmp(organ[x].organname, donors[y].organname)==0) && (strcmp(organ[x].bloodtype, donors[y].bloodtype)==0) && (organ[x].received!=1)){
match++;
if (match>0)
possible=organCompare(organ, x, possible);
else if (match==0)
possible=x;
}
else continue;
}
if (possible>-1){
organ[possible].received=1;
printf("%s %s\n",organ[possible].name, organ[possible].organname);
}
else
printf("No match found\n");
free(organ);
free(donors);
}
}
void scanOrgans(int x,organT* organ){
int i;
char temp[256];
for(i=0;i<x;i++){
scanf("%s",&organ[i].name);
scanf("%s",&organ[i].organname);
scanf("%s",&organ[i].bloodtype);
scanf("%s",&temp);
sscanf(temp,"%d/%d/%d",&organ[i].dateAdded.month,&organ[i].dateAdded.day,&organ[i].dateAdded.year);
scanf("%s",&temp);
sscanf(temp,"%d:%d",&organ[i].timeAdded.hour,&organ[i].timeAdded.minute);
}
}
void scanDonors(int x, organT* donors ){
int i;
for(i=0;i<x;i++){
scanf("%s%s", &donors[i].organname, &donors[i].bloodtype);
}
}
int organCompare(organT* organ, int x, int y){
if (organ[x].dateAdded.year<organ[y].dateAdded.year)
return x;
else if(organ[x].dateAdded.year==organ[y].dateAdded.year){
if (organ[x].dateAdded.month<organ[y].dateAdded.month)
return x;
else if(organ[x].dateAdded.month==organ[y].dateAdded.month){
if (organ[x].dateAdded.day<organ[y].dateAdded.day)
return x;
else if (organ[x].dateAdded.day==organ[y].dateAdded.day){
if (organ[x].timeAdded.hour<organ[y].timeAdded.hour)
return x;
else if (organ[x].timeAdded.hour==organ[y].timeAdded.hour){
if (organ[x].timeAdded.minute<organ[y].timeAdded.minute)
return x;
else return y;
}
else return y;
}
else return y;
}
else return y;
}
else return y;
}
答案 0 :(得分:2)
在int main()
之前添加这三行:
#include <string.h>
void scanOrgans(int x, organT* organ);
void scanDonors(int x, organT* donors );
int organCompare(organT* organ, int x, int y);
答案 1 :(得分:2)
将scanf
与char *
一起使用时,您通常不需要&
,因为您已有指针。所以改变:
scanf("%s",&organ[i].name);
scanf("%s",&organ[i].organname);
scanf("%s",&organ[i].bloodtype);
为:
scanf("%s",organ[i].name);
scanf("%s",organ[i].organname);
scanf("%s",organ[i].bloodtype);
此外,不是这样的错误,但在C中你永远不应该转换malloc的结果,所以改变就好了。
donors = (organT *)malloc(numberOfDonors*sizeof(organT));
为:
donors = malloc(numberOfDonors*sizeof(organT));
答案 2 :(得分:2)
这不是你的问题,但请避免使用比较器中的结构。试试这个:
int organCompare(organT* organ, int x, int y)
{
if (organ[x].dateAdded.year < organ[y].dateAdded.year)
return x;
else if (organ[x].dateAdded.year > organ[y].dateAdded.year)
return y;
else if (organ[x].dateAdded.month < organ[y].dateAdded.month)
return x;
else if (organ[x].dateAdded.month < organ[y].dateAdded.month)
return y;
else if (organ[x].dateAdded.day < organ[y].dateAdded.day)
return x;
else if (organ[x].dateAdded.day > organ[y].dateAdded.day)
return y;
else if (organ[x].timeAdded.hour < organ[y].timeAdded.hour)
return x;
else if (organ[x].timeAdded.hour > organ[y].timeAdded.hour)
return y;
else if (organ[x].timeAdded.minute < organ[y].timeAdded.minute)
return x;
else
return y;
}
答案 3 :(得分:1)
编译器抱怨,因为您正在使用未通过函数原型明确定义的函数。我在工作中留下了我的C引用,所以我找不到确切的段落,但是编译器会猜测函数原型,这会导致你看到的“冲突类型”警告或错误。如果你没有指定任何东西,C从内存中假定函数返回int
。
这是我最好的猜测。如果David Schwartz的修复有效,我会非常肯定这是原因。