所以我在编译这个程序时遇到了问题,我只是无法让它工作,我的意思是如果我将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);
}
答案 0 :(得分:7)
在C中,参数按值传递,因此对函数内部参数所做的任何修改都将是本地修改。
让我们看看下面的代码片段,它基本上是您尝试做的非常简单的版本:
void GetNumber(int number)
{
printf("Type a number:\n");
scanf("%d", &number); // modifies the local variable `number`?
}
...
int n = 0;
GetNumber(n);
现在调用n
之后GetNumber
的价值是什么?
嗯,这不是用户输入的数字,但它仍然是0,即调用n
之前包含的值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();
与相应的功能不匹配。
答案 1 :(得分:5)
您正在通过值传递struct
,这就是函数未修改它的原因。您应该更改旨在修改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);
}
答案 2 :(得分:1)
您似乎希望对s
内的结构变量inputstudent()
所做的更改反映回原始变量。在这种情况下,您需要将变量的地址传递给函数而不是其值。
如果您将s
的值传递给函数而不是其地址,则会在s
内创建inputstudent()
的新副本和值在s
中的main()
保持不变时,将会读入此副本。
要解决此问题,您需要inputstudent()
指向s
中main()
的指针,并在读取数据时使inputstudent()
使用此地址。这样,inputstudent()
中对变量所做的更改将反映回s
中的main()
。
调用函数
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()
。
答案 3 :(得分:1)
如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);
}
答案 4 :(得分:-2)
您无法在struct student s
中使用inputstudent()
作为参数。它只是一个有价值的副本
您应该使用指针作为参数。
为:
void inputstudent(struct student* s)
{...}
int main(){
struct student s;
inputstudent(&s);
displaystudent(s);
return 0;
}
答案 5 :(得分:-2)
您的问题基本上有两个原因。
inputstudent
函数。 您可以通过将声明和定义中的函数原型更改为
来解决这两个问题void displaystudent(struct student s);
void inputstudent(struct student &s);