gpt4 book ai didi

c - 结构指针运算符

转载 作者:行者123 更新时间:2023-11-30 20:24:25 26 4
gpt4 key购买 nike

代码的目的是创建一个指向学生结构的指针数组,以便在其他函数中使用该指针数组。我不确定如何在二元函数中使用箭头运算符。它不会返回找到 id 的索引值。

typedef struct{
int IDno;
char name[20];
int project;
int exam;
double final;
} student;

student **create_class_list(char*filename, int *sizePtr);
void print_list(student**list,int *sizePtr);
int find_binsrch(int idNo, student **list, int size,int low, int high);

int main(void){

int i, n;
student **listPtr;
listPtr = create_class_list("student.txt", &n);
print_list(listPtr,&n);
index2 = find_binsrch(searchID, listPtr, n, 1200, 4580);
}

student **create_class_list(char *filename, int *sizeptr){

int n,i;
FILE *fptr;
fptr=fopen(filename,"r");
if(fptr==NULL)
printf("The file could not be opened.\n");
else
fscanf(fptr, "%d",sizeptr);

n=*sizeptr;

student **list;
list = (student**)calloc(1, sizeof(student*));


for(i=0;i<n;i++){
list[i]=(student*)calloc(n,sizeof(student));
fscanf(fptr,"%d %[^\n]s", &(list[i]->IDno),(list[i]->name));
}

return list;
}

void print_list(student**list,int *sizePtr){
int i;
for(i=0; i<*sizePtr; i++){
printf("%d %s\n",&(list[i]->IDno),(list[i]->name));
}
}

int find_binsrch(int idNo, student **list, int size, int low, int high){
int middle, i;

while(low<=high){
middle =(low+high)/2;

printf("%d\n", middle);

if(idNo==list[middle]->IDno)
return list[i]->IDno;

if(idNo<list[middle]->IDno)
high = middle -1;
else
low = middle +1;
return -1;
}
}

最佳答案

您必须学会做的是每次编译时启用警告。这使得编译器能够识别代码中需要注意的许多区域。您不应该接受编译时带有警告的代码。只有在非常非常罕见的情况下,才可以接受编译时带有警告的代码(您在编程的第一年可能不会遇到这种情况),因此请始终启用 -Wall -Wextra 作为一部分你的编译字符串。 (您还可以启用 -pedantic 来查看其他警告以及一些特定的警告请求,但对于一般用途,-Wall -Wextra 即可)

如果您编译时带有警告,您会看到:

students3.c: In function ‘main’:
students3.c:23:5: error: ‘index2’ undeclared (first use in this function)
index2 = find_binsrch(searchID, listPtr, n, 1200, 4580);
^
students3.c:23:5: note: each undeclared identifier is reported only once for each function it appears in
students3.c:23:27: error: ‘searchID’ undeclared (first use in this function)
index2 = find_binsrch(searchID, listPtr, n, 1200, 4580);
^
students3.c:19:9: warning: unused variable ‘i’ [-Wunused-variable]
int i, n;
^
students3.c: In function ‘print_list’:
students3.c:53:9: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=]
printf("%d %s\n",&(list[i]->IDno),(list[i]->name));
^
students3.c: In function ‘find_binsrch’:
students3.c:57:48: warning: unused parameter ‘size’ [-Wunused-parameter]
int find_binsrch(int idNo, student **list, int size, int low, int high){
^
students3.c: In function ‘main’:
students3.c:24:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
students3.c: In function ‘find_binsrch’:
students3.c:74:1: warning: control reaches end of non-void function [-Wreturn-type]
}
<snip>

简单地解决警告/错误并重新编译(以及解决修复第一个列表中披露的新警告/错误)将允许您系统地更正您的代码。采取这些基本步骤将允许您更正代码,使其可以在没有警告的情况下进行编译:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct{
int IDno;
char name[20];
int project;
int exam;
double final;
} student;

student **create_class_list(char*filename, int *sizePtr);
void print_list(student**list,int *sizePtr);
int find_binsrch(int idNo, student **list, int size,int low, int high);

int main(void){

int n, index2, searchID = 2;
student **listPtr = NULL;
listPtr = create_class_list("student.txt", &n);
if (!listPtr) {
fprintf (stderr, "error: create_class_list failed.\n");
return 1;
}
print_list(listPtr,&n);
index2 = find_binsrch(searchID, listPtr, n, 1200, 4580);

if (index2) {} /* stub to eliminate unused warning */

return 0;
}

student **create_class_list(char *filename, int *sizeptr){

int n,i;
FILE *fptr;
fptr=fopen(filename,"r");
if(fptr==NULL)
printf("The file could not be opened.\n");
else
fscanf(fptr, "%d",sizeptr);

n=*sizeptr;

student **list;
list = (student**)calloc(n, sizeof(student*));


for(i=0;i<n;i++){
list[i]=(student*)calloc(n,sizeof(student));
fscanf(fptr,"%d %[^\n]s", &(list[i]->IDno),(list[i]->name));
}

return list;
}

void print_list(student**list,int *sizePtr){
int i;
for(i=0; i<*sizePtr; i++){
printf("%d %s\n",list[i]->IDno, list[i]->name);
}
}

int find_binsrch(int idNo, student **list, int size, int low, int high)
{
int middle;

if (size) {} /* stub to eliminate unused warning */

while(low<=high){
middle =(low+high)/2;

printf("%d\n", middle);

if(idNo==list[middle]->IDno)
return list[middle]->IDno;

if(idNo<list[middle]->IDno)
high = middle -1;
else
low = middle +1;
}
return -1;
}

注意:它是否正确运行确实是一个不同的问题,这取决于您的数据和消除任何逻辑错误。

关于c - 结构指针运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33557318/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com