C 将结构传递给函数
所以我在编译这个程序时遇到了一个问题,我就是不能让它工作,我的意思是如果我把C 将结构传递给函数,c,function,structure,C,Function,Structure,所以我在编译这个程序时遇到了一个问题,我就是不能让它工作,我的意思是如果我把inputstudent()代码放在main()中,这会容易得多,但我必须将代码放在函数中,inputstudent()并从main()调用。我知道这听起来很简单,但我搞不懂 #include <stdio.h> #include <stdlib.h> struct student { char surname[50]; int age; char oname[50];
inputstudent()
代码放在main()
中,这会容易得多,但我必须将代码放在函数中,inputstudent()
并从main()
调用。我知道这听起来很简单,但我搞不懂
#include <stdio.h>
#include <stdlib.h>
struct student
{
char surname[50];
int age;
char oname[50];
char address[50];
};
void displaystudent();
void inputstudent();
int main(){
struct student s;
inputstudent(s);
displaystudent(s);
return 0;
}
void inputstudent(struct student s){
printf("Enter the surname: ");
scanf("%s",s.surname);
printf("Enter the other name: ");
scanf("%s",s.oname);
printf("Enter the age: ");
scanf("%d",&s.age);
printf("Enter the address: ");
scanf("%s",s.address);
}
void displaystudent(struct student s)
{
printf("Surname: %s \n",s.surname);
printf("Oname: %s \n",s.oname);
printf("Age: %d \n",s.age);
printf("Address: %s",s.address);
}
#包括
#包括
结构学生
{
查氏[50];
智力年龄;
char-oname[50];
字符地址[50];
};
无效显示学生();
无效输入学生();
int main(){
结构学生;
输入学生;
学生;;
返回0;
}
无效输入学生(结构学生s){
printf(“输入姓氏:”);
scanf(“%s”,s姓);
printf(“输入其他名称:”);
scanf(“%s”,s.oname);
printf(“输入年龄:”);
scanf(“%d”和s.age);
printf(“输入地址:”);
scanf(“%s”,s.地址);
}
无效显示学生(结构学生s)
{
printf(“姓氏:%s\n”,s.姓氏);
printf(“Oname:%s\n”,s.Oname);
printf(“年龄:%d\n”,s.Age);
printf(“地址:%s”,s地址);
}
您不能将struct student s
用作inputstudent()中的参数。这只是一份价值副本。
您应该使用指针作为参数。
作为:
在C语言中,参数是通过值传递的,因此对函数中的参数所做的任何修改都将是局部修改
让我们看一下下面的代码片段,它基本上是您尝试执行的操作的一个非常简单的版本:
void GetNumber(int number)
{
printf("Type a number:\n");
scanf("%d", &number); // modifies the local variable `number`?
}
...
int n = 0;
GetNumber(n);
现在,在调用GetNumber
之后,n
的值是多少
这不是用户输入的数字,但仍然是0,这是调用GetNumber
之前包含的值
您需要的是:
void GetNumber(int *pnumber)
{
printf("Type a number:\n");
scanf("%d", pnumber); // modifies the value pointed by the pointer pnumber
}
...
int n = 0;
GetNumber(&n); // &n is the memory address of the variable n
你需要阅读C教材中有关指针的章节
其他不太重要的问题
你的原型
void displaystudent();
void inputstudent();
与相应的函数不匹配。您似乎希望将对结构变量s
内部inputstudent()
所做的更改反映回原始变量。在这种情况下,您需要将变量的地址而不是其值传递给函数
如果将s
的值传递给函数而不是它的地址,则s
的新副本将在inputstudent()
中创建,并且在main()
中的s
保持不变的情况下,这些值将被读取到此副本中
要解决此问题,请在main()
中给inputstudent()
一个指向s
的指针,并使inputstudent()
在读取数据时使用此地址。这样,对inputstudent()
中变量所做的更改将反映回main()
中的s
调用如下函数
inputstudent(&s);
要使用指向结构变量的指针访问结构变量的成员,请使用->
运算符而不是
运算符
void inputstudent(struct student *s){
printf("Enter the surname: ");
scanf("%s",s->surname);
printf("Enter the other name: ");
scanf("%s",s->oname);
printf("Enter the age: ");
scanf("%d",&s->age);
printf("Enter the address: ");
scanf("%s",s->address);
}
此外,地址可能包含空格,scanf()
在其中不起作用。您可以使用fgets()
。正如Michael Walz所提到的,使用指针来修改函数调用中的结构。此外,您的函数签名和定义不匹配,这就是编译器抱怨的原因:
#include <stdio.h>
#include <stdlib.h>
struct student {
char surname[50];
int age;
char oname[50];
char address[50];
};
void displaystudent(struct student* pStudent);
void inputstudent(struct student* pStudent);
int main() {
struct student aStudent;
inputstudent(&aStudent);
displaystudent(&aStudent);
return 0;
}
void inputstudent(struct student* pStudent){
printf("Enter the surname: ");
scanf("%s", pStudent->surname);
printf("Enter the other name: ");
scanf("%s", pStudent->oname);
printf("Enter the age: ");
scanf("%d", &pStudent->age);
printf("Enter the address: ");
scanf("%s", pStudent->address);
}
void displaystudent(struct student* pStudent)
{
printf("Surname: %s \n", pStudent->surname);
printf("Oname: %s \n", pStudent->oname);
printf("Age: %d \n", pStudent->age);
printf("Address: %s", pStudent->address);
}
#包括
#包括
结构学生{
查氏[50];
智力年龄;
char-oname[50];
字符地址[50];
};
无效显示学生(结构学生*pStudent);
无效输入学生(结构学生*pStudent);
int main(){
结构学生;
输入学生(和学生);
显示学生(&aStudent);
返回0;
}
无效输入学生(结构学生*pStudent){
printf(“输入姓氏:”);
scanf(“%s”,学生->姓氏);
printf(“输入其他名称:”);
scanf(“%s”,pStudent->oname);
printf(“输入年龄:”);
scanf(“%d”,&p学生->年龄);
printf(“输入地址:”);
scanf(“%s”,pStudent->address);
}
无效显示学生(结构学生*pStudent)
{
printf(“姓氏:%s\n”,学生->姓氏);
printf(“Oname:%s\n”,pStudent->Oname);
printf(“年龄:%d\n”,学生->年龄);
printf(“地址:%s”,pStudent->Address);
}
您正在按值传递结构,这就是函数不修改它的原因。您应该更改用于修改struct
的函数,将struct
指针作为参数:
#include <stdio.h>
#include <stdlib.h>
struct student {
char surname[50];
int age;
char oname[50];
char address[50];
};
void displaystudent(struct student s);
void inputstudent(struct student *s);
int main() {
struct student s;
inputstudent(&s);
displaystudent(s);
return 0;
}
void inputstudent(struct student *s) {
printf("Enter the surname: ");
scanf("%s", s->surname);
printf("Enter the other name: ");
scanf("%s", s->oname);
printf("Enter the age: ");
scanf("%d", &s->age);
printf("Enter the address: ");
scanf("%s", s->address);
}
void displaystudent(struct student s) {
printf("Surname: %s \n", s.surname);
printf("Oname: %s \n", s.oname);
printf("Age: %d \n", s.age);
printf("Address: %s", s.address);
}
#包括
#包括
结构学生{
查氏[50];
智力年龄;
char-oname[50];
字符地址[50];
};
无效显示学生(结构学生s);
无效输入学生(结构学生*s);
int main(){
结构学生;
输入学生(&s);
学生;;
返回0;
}
无效输入学生(结构学生*s){
printf(“输入姓氏:”);
scanf(“%s”,s->姓氏);
printf(“输入其他名称:”);
scanf(“%s”,s->oname);
printf(“输入年龄:”);
scanf(“%d”,&s->age);
printf(“输入地址:”);
scanf(“%s”,s->address);
}
无效显示学生(结构学生s){
printf(“姓氏:%s\n”,s.姓氏);
printf(“Oname:%s\n”,s.Oname);
printf(“年龄:%d\n”,s.Age);
printf(“地址:%s”,s地址);
}
您的问题基本上有两个原因
函数声明没有任何参数
该结构是通过值传递的,而不是对inputsudent
函数的引用李>
您可以通过将声明和定义中的函数原型都更改为
void displaystudent(struct student s);
void inputstudent(struct student &s);
请正确设置代码格式“无法使其工作”是什么意思?问题是什么?void-inputstuden(struct-student-s)
->void-inputstuden(struct-student*s)
,以及scanf(“%s”,s.姓氏)代码>->scanf(“%s”,s->姓氏)代码>等。您可能希望尝试这种方法
void displaystudent(struct student s);
void inputstudent(struct student &s);