在C中处理结构函数 - 可以输入数组但不能输入int

时间:2016-12-24 09:58:53

标签: c arrays struct

我在使用函数内部的结构时遇到了一些麻烦。

该计划旨在:

  1. 创建一个包含五个Person类型结构的数组
  2. 允许用户通过使用函数输入数据类型。
  3. 逐个打印五个输入的人。
  4. 虽然第1点和第3点工作正常,但我遇到了问题。该名称将输入并打印得很好,但无论我输入scanf它返回并打印' -858993460'。

    int calls = 0;
    
    typedef struct person {
        char name[20];
        int bYr;
    }Person;
    
    int main(int argc, char** argv) {
        Person psn[5];
    
        for (int i = 0; i < 5; i++) {
            printf("Please enter the name and birthyear of person %d.", i+1);
            personName(psn[i].name);
            personBirthyear(psn[i].bYr);
        }
    
        for (int i = 0; i < 5; i++) {
            printPerson(psn[i]);
        }
    
        getchar();
    
        return 0;
    }
    
    int personBirthyear(int birthyear) {
        printf("\nBirthyear: ");
        scanf("%d", &birthyear);
        getchar();
        return birthyear;
    }
    
    char* personName(char* pername) {
        printf("\nName: ");
        fgets(pername, 20, stdin);
        return pername;
    }
    
    void printPerson(Person prsn) {
        printf("Person %d:\nBirthyear: %d\nName: %s\n", calls+1, prsn.bYr, prsn.name);
        calls++;
    }
    

2 个答案:

答案 0 :(得分:1)

足够简单:您没有更新information年,但是您将其作为复制的参数传递(您在Person中复制int以及指向personBirthyearchar的指针。

因此:

personName

您需要传递年份的地址,并在此处使用指针:

personName(psn[i].name); // works
personBirthyear(psn[i].bYr); // fails

或者,您也可以删除出生年份:

int personBirthyear(int* birthyear) {
    printf("\nBirthyear: ");
    scanf("%d", birthyear);
    getchar();
    return *birthyear;
}

然后:int personBirthyear() { int birthyear; printf("\nBirthyear: "); scanf("%d", &birthyear); getchar(); return birthyear; }

在任何情况下,您都不检查scanf的结果;因此你不知道你是否真的读过一个数字。你应该检查一下:

psn[i].bYr = personBirthyear();

int n = scanf("%d", &birthyear); getchar(); if (n != 1) return -1; return birthyear; 仍然必须“清除”使getchar失败的字符(否则,它会一次又一次地重读......)。

答案 1 :(得分:0)

您的代码中存在一些问题:

  1. 从功能返回时,您没有收到输出。
  2. 没有函数声明编译器会混淆函数返回类型。
  3. 你应该知道你是否想要接受函数调用之间的修改数据,数据应该作为传递参考提供。在您的程序中,您将数据提供给personBirthyear()函数作为值调用。