C语言中未声明的参数

C语言中未声明的参数,c,arguments,undeclared-identifier,C,Arguments,Undeclared Identifier,我试图用C语言编译我的程序,我得到的错误如下: (请注意,我是这门语言的初学者。) 例外3.c:在函数“addstudent”中: Excer3.c:50: error: `student' undeclared (first use in this function) Excer3.c:50: error: (Each undeclared identifier is reported only once Excer3.c:50: error: for each function it app

我试图用C语言编译我的程序,我得到的错误如下: (请注意,我是这门语言的初学者。)

例外3.c:在函数“addstudent”中:

Excer3.c:50: error: `student' undeclared (first use in this function)
Excer3.c:50: error: (Each undeclared identifier is reported only once
Excer3.c:50: error: for each function it appears in.)
Excer3.c:50: error: parse error before "newS"
Excer3.c:50: error: `newS' undeclared (first use in this function)
Excer3.c:50: error: parse error before ')' token
Excer3.c:52: error: `studentName' undeclared (first use in this function)
Excer3.c: At top level:
Excer3.c:59: error: parse error before '*' token
Excer3.c: In function `readdb':
Excer3.c:70: error: `students' undeclared (first use in this function)
Excer3.c:70: warning: passing arg 2 of `addstudent' makes integer from pointer without                 a cast
我的代码看起来像这样。函数无法识别给定的参数:

#include <stdio.h>

struct student {
int studentnumber;
char* Name;
struct student* next;
};

struct teacher {
int teachernumber;
char* Name;
struct teacher* next;
};

struct course {
struct teacher teachers[5];
struct student students[50];
int semesternumber;
struct course* next;
};

int readline(char s[],int lim)
{
  int c, i;
  for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='\n'; ++i)
    s[i] = c;
  if (c == '\n') {
    s[i] = c;
    ++i;
  }
  s[i] = '\0';
  return i;
}

int addstudent (struct student* prev, int studentnumber, char* studentname)
{
if (!(prev==NULL))
  student newS = (student*)malloc(sizeof(student));
  newS->studentnumber = studentnumber;
  newS->firstname = strdup(studentName);
  newS->next = NULL;
  prev->next=newS;

  return 1;
}

int readdb(student* students)
{
char line[200];
int* studentnumber,coursenumber,teachernumber,semesternumber;
char studentname[100],teachername[100],coursename[100];

while(readline(line,200) > 0)
{
if(sscanf(line, "S %d %s", &studentnumber, studentname)==2)
{
 printf("Student. \n\tStudent number: %d, \n\tFirst name: %s\n", studentnumber,  
studentname);
 addstudent(students,&studentnumber,studentname);
 }
else if(sscanf(line, "C %d %s %d", &coursenumber, coursename , &semesternumber)==3)
   printf("Course. \n\tCourse number: %d \n\tCourse name: %s \n\tSemester: %d\n",   
coursenumber, coursename, semesternumber);
else if(sscanf(line, "E %d %d", &studentnumber, &coursenumber)==2)
printf("Enrolment. \n\tStudent number: %d, \n\tCourse number: %d\n", studentnumber, 
coursenumber);
else if(sscanf(line, "T %d %s", &teachernumber, teachername)==2)
 printf("Teacher. \n\tTeacher number: %d, \n\tFirst name: %s\n", teachernumber,  
teachername);
else if(sscanf(line, "A %d %s", &teachernumber, &coursenumber)==2)
 printf("Assignment. \n\tTeacher number: %d, \n\tCourse number: %d\n", teachernumber,
coursenumber);
}

}


int main () 
{
struct student* students = NULL;

readdb(&students);
return 0;

}
#包括
结构学生{
国际学生编号;
字符*名称;
结构学生*下一步;
};
结构教师{
int教师编号;
字符*名称;
结构教师*next;
};
结构课程{
结构教师[5];
结构学生[50];
整数;
结构课程*下一步;
};
int readline(字符s[],int lim)
{
int c,i;
对于(i=0;i学生编号=学生编号;
新闻->名字=strdup(学生名字);
新闻->下一步=空;
上一个->下一个=新闻;
返回1;
}
int readdb(学生*学生)
{
字符行[200];
int*学生编号、课程编号、教师编号、学期编号;
char studentname[100]、teachername[100]、coursename[100];
while(readline(第200行)>0)
{
如果(sscanf(第%d%S行,&studentnumber,studentname)==2)
{
printf(“学生。\n\t学生编号:%d,\n\t第一个姓名:%s\n”,学生编号,
学生姓名);
addstudent(学生和学生编号、学生姓名);
}
否则如果(sscanf(行,“C%d%s%d”、&coursenumber、coursename和semesternumber)==3)
printf(“课程。\n\t课程编号:%d\n\t课程名称:%s\n\t课程名称:%d\n”,
coursenumber、coursename、semesternumber);
否则如果(sscanf(行,“E%d%d”、&studentnumber和coursenumber)==2)
printf(“注册。\n\t学生编号:%d\n\t课程编号:%d\n”,学生编号,
课程编号);
else if(sscanf(行,“T%d%s”&教师编号,教师姓名)=2)
printf(“教师。\n\t教师编号:%d,\n\t第一个姓名:%s\n”,教师编号,
教师姓名);
else if(sscanf(行,“A%d%s”、&teachernumber和coursenumber)==2)
printf(“作业。\n\t教师编号:%d,\n\t课程编号:%d\n”,教师编号,
课程编号);
}
}
int main()
{
struct student*students=NULL;
readdb(和学生);
返回0;
}

addstudent
中,您声明

student newS = (student*)malloc(sizeof(student));

您声明的应该是
addstudent
中的
struct student newS

student newS = (student*)malloc(sizeof(student));

这应该是
struct student newS

您使用的是
student
而不是
struct student
如果您只想使用
student
,那么您需要使用
typedef struct student student在您的代码中。

您使用的是
student
而不是
struct student
如果您只想使用
student
,则需要使用
typedef struct student在您的代码中。

现有的答案是正确的:
student
目前不是程序中的类型名,但是
struct student
是。你已经正确地使用了这个,所以要保持一致

冒着脱离代码审查领域的风险,
addstudent
仍然不会做你想做的事

int addstudent (struct student* prev, int studentnumber, char* studentname)
{
    if (!(prev==NULL))
        student newS = (student*)malloc(sizeof(student));
    newS->studentnumber = studentnumber;
    newS->firstname = strdup(studentName);
    newS->next = NULL;
    prev->next=newS;

    return 1;
}
因此,这是试图附加到链接列表的末尾,这很好,但有一些错误:

  • newS
    声明应该是
    struct student*newS=malloc(sizeof(*newS))

  • 我们修复了编译器抱怨的结构名称
  • malloc返回指针,因此
    newS
    也必须是指针
  • p=malloc(sizeof(*p))
    是一种常见的习惯用法,它可以避免将来更改
    p
    的类型时出现错误,但忘记编辑sizeof表达式
  • 您当前仅在if语句的范围内声明
    newS
    ——这意味着引用
    newS
    的以下行将不会编译,因为它们看不到该变量。我们可以像这样用大括号扩展范围:
    if(prev){…}返回1

  • newS->next
    总是设置为NULL,因此如果
    prev->next
    已经有一个值,它将被丢弃。这意味着您的链接列表只能有一个学生。如果您想将列表链接在一起,应该

    newS->next = prev->next;
    prev->next = newS;
    
  • 您混淆了
    struct student**
    (这是在
    readdb(&students)
    中传递的类型)和
    struct student*
    。。。你需要找出你想要的,并坚持下去。当前的
    addstudent
    代码只有在您有一个
    struct student
    实例(不是指针)并且将next初始化为NULL作为列表的头时才有效


现有答案是正确的:
student
目前不是程序中的类型名称,但
struct student
是。你已经正确地使用了这个,所以要保持一致

冒着脱离代码审查领域的风险,
addstudent
仍然不会做你想做的事

int addstudent (struct student* prev, int studentnumber, char* studentname)
{
    if (!(prev==NULL))
        student newS = (student*)malloc(sizeof(student));
    newS->studentnumber = studentnumber;
    newS->firstname = strdup(studentName);
    newS->next = NULL;
    prev->next=newS;

    return 1;
}
因此,这是试图附加到链接列表的末尾,这很好,但有一些错误:

  • newS
    声明应该是
    struct student*newS=malloc(sizeof(*newS))

  • 我们修复了编译器抱怨的结构名称
  • malloc返回指针,因此
    newS
    也必须是指针
  • p=malloc(sizeof(*p))
    是一种常见的习惯用法,它可以避免将来更改
    p
    的类型时出现错误,但忘记编辑sizeof表达式
  • 您当前仅在if语句的范围内声明
    newS
    ——这意味着引用
    newS
    的以下行将不会编译,因为它们看不到该变量。我们可以像这样用大括号扩展范围:
    if(prev){…}返回1

  • newS->next
    始终设置为NULL,因此如果
    prev->next
    a