仅返回结构C中的第一个结果的搜索
我正在尝试读取一个文件并打印跳线超过用户提供的距离的记录,但搜索只返回文件中的第一行,就是这样,我知道逻辑中有错误,但我无法指出仅返回结构C中的第一个结果的搜索,c,search,sequential,C,Search,Sequential,我正在尝试读取一个文件并打印跳线超过用户提供的距离的记录,但搜索只返回文件中的第一行,就是这样,我知道逻辑中有错误,但我无法指出 #include<stdio.h> #include<string.h> typedef struct { char fname[30]; char lname[30]; char nationality [30]; double distance; }Player; void print(P
#include<stdio.h>
#include<string.h>
typedef struct {
char fname[30];
char lname[30];
char nationality [30];
double distance;
}Player;
void print(Player p) {
printf("%s %s %s %f \n", p.fname, p.lname, p.nationality, p.distance);
}
int search(double distance, Player allPlayers[], int max){
int i=0;
for(i=0; i<max; i++){
if(distance > allPlayers[i].distance){
return i;
}
return -1;
}
}
void load (char filename[10], Player players[]){
char tempfName [30];
char templName [30];
char tempNationality [30];
double tmpdistance;
FILE * input=fopen(filename,"r+");
if(input==NULL)
printf("Error found in opening the file\n");
else {
printf("The data are loaded successfully.\n");
int counter = 0;
while(!feof(input)){
strcpy(tempfName," ");
fscanf(input, "%s %s %s %f",tempfName, templName, tempNationality, &tmpdistance);
if(strcmp(tempfName, " ") !=0){
strcpy(players[counter].fname, tempfName);
strcpy(players[counter].lname, templName);
strcpy(players[counter].nationality, tempNationality);
players[counter].distance = tmpdistance;
counter++;
}
}
fclose(input);
}
}
int main (int argc, char *argv[]){
Player players2[40];
char myFileName[10] ="jump.txt";
load(myFileName, players2);
double tmpdistance;
printf("Please enter the distance threshold: ");
scanf("%lf", &tmpdistance);
printf("The jumpers exceeded 8.10 m are: \n");
int index = -1;
index = search(tmpdistance,players2,40);
if(index!=-1)
print(players2[index]);
else
printf("NOT Found! \n");
return 0;
}
#包括
#包括
类型定义结构{
char-fname[30];
字符名称[30];
查尔族[30];
双倍距离;
}玩家;
无效打印(玩家p){
printf(“%s%s%s%f\n”,p.fname,p.lname,p.national,p.distance);
}
整数搜索(双倍距离,玩家所有玩家[],整数最大值){
int i=0;
对于(i=0;i所有玩家[i]。距离){
返回i;
}
返回-1;
}
}
无效加载(字符文件名[10],玩家[]){
char tempfName[30];
字符模板名称[30];
国籍[30];
双TMP距离;
FILE*input=fopen(文件名为“r+”);
如果(输入==NULL)
printf(“打开文件时发现错误”);
否则{
printf(“数据加载成功。\n”);
int计数器=0;
而(!feof(输入)){
strcpy(tempfName,“”);
fscanf(输入,“%s%s%s%f”、tempfName、tempname、tempNationality和tmpdistance);
如果(strcmp(tempfName,“”)=0){
strcpy(玩家[计数器].fname,tempfName);
strcpy(玩家[计数器].lname,模板名);
strcpy(球员[柜台]。国籍,临时国籍);
玩家[计数器]。距离=TMP距离;
计数器++;
}
}
fclose(输入);
}
}
int main(int argc,char*argv[]){
玩家2[40];
char myFileName[10]=“jump.txt”;
加载(myFileName,players2);
双TMP距离;
printf(“请输入距离阈值:”);
扫描频率(“%lf”、&tmpdistance);
printf(“超过8.10米的跳线为:\n”);
int指数=-1;
索引=搜索(tmpdistance,players2,40);
如果(索引!=-1)
打印(players2[索引]);
其他的
printf(“未找到!\n”);
返回0;
}
我试图读取的文件中的一些示例数据:
亚美尼亚阿森萨尔基西亚7.62
佐治亚州博列斯拉夫斯基特拉泽7.26
克里斯蒂安·雷夫德国7.92
Christopher Tomlinson Great_Britain 8.06在搜索()功能中:
if(distance > allPlayers[i].distance){
return i;
}
这将返回性能小于所提供距离的第一个跳线
如果将其替换为:
if(allPlayers[i].distance > distance){
return i;
}
它将返回性能大于所提供距离的第一个跳线,这是您想要的
此外:
不要循环使用feof()
读取文件:
您正在打印“数据已成功加载”,而您尚未加载数据-您刚刚打开了文件
main()
在下一行分配时,不需要将索引初始化为-1
您不需要指定myFileName
的大小,因为编译器可以计算出来
return-1代码>移动到for-loop后。使用%lf
而不是fscanf
的%f
进行double
非常感谢,非常有用。