将结构传递给函数

时间:2017-09-07 06:47:41

标签: c function structure

所以我在编译这个程序时遇到了问题,我只是无法让它工作,我的意思是如果我将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);
}

6 个答案:

答案 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()指向smain()的指针,并在读取数据时使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)

您的问题基本上有两个原因。

  1. 函数声明没有任何参数。
  2. 结构按值传递,而不是引用inputstudent函数。
  3. 您可以通过将声明和定义中的函数原型更改为

    来解决这两个问题
    void displaystudent(struct student s);
    void inputstudent(struct student &s);