簡體   English   中英

如何創建一個向結構成員讀取/寫入數據的函數?

[英]How to create a function to read/write data to struct members?

我正在嘗試創建一個程序,該程序使用c ++讀取和打印學生的數據。 為此,我創建了一個結構學生,一個從用戶讀取數據並將其分配給結構實例s1的函數,以及一個在屏幕上打印學生數據的函數,我認為問題在於讀取函數/寫入數據。

這是我的代碼:

#include<iostream>
#include<string>
using namespace std;

struct Student
{
    char name[30];
    int age;
    double gpa;
    string department;
};

Student read_data(Student x)
{
    cout << "Name (30 characters maximum): ";
    cin.get(x.name, 30);
    cout << "Age: ";
    cin >> x.age;
    cout << "Department: ";
    cin >> x.department;
    cout << "GPA: ";
    cin >> x.gpa;

    return x;
}

void print_data(Student x)
{
    cout << 
"\n***************************************************************" << endl;
    cout << "Name: " << x.name << endl;
    cout << "Age: " << x.age << endl;
    cout << "Department: " << x.department << endl;
    cout << "GPA: " << x.gpa << endl;
}

int main()
{
    Student s1, s2, s3;

    cout << "This program stores -Temporarily- data of three students\n" << endl;

    cout << "Enter 1st student's data" << endl;

    read_data(s1);

    print_data(read_data(s1));

    system("pause");
    return 0;
}

此代碼的輸出是:

This program stores data of three students

Enter 1st student's data
Name (30 characters maximum): Ahmed Maysara
Age: 22
Department: CS
GPA: 3.5
Name (30 characters maximum): Age: Department: GPA:
***************************************************************
Name:
Age: -858993460
Department:
GPA: -9.25596e+61
Press any key to continue . . .

如您所見,輸出超出了我的期望:) ..

有幫助嗎?

CinCout和David都是正確的。 現在,您的代碼存在兩個問題。 第一個問題是,當您成功調用函數read_data(s1) ,s1只是一個副本。 因此,當函數使用cin為學生設置所有值時,實際上只是在設置副本的值。 您可以這樣做,以便傳遞原件,也可以返回學生(正在做),並將s1設置為等於結果(不是)。

為了確保傳遞原件,可以轉到聲明為read_data的位置。 與其說出Student read_data(Student x) ,不如不希望將其復制到要復制Student read_data(Student &x)的參數后面。 這稱為通過引用傳遞(您引用原始文件而不是通過副本引用)

或者,您可以將s1設置為在main中調用它的結果。 您可以說s1 = read_data(s1); 效果很好,盡管效率低一些。

最后,代碼中另一個明顯的錯誤是您在說出print_data(read_data(s1))時意外地再次調用read_data。 而是說print_data(s1)

不必在每次調用read_data和print_data時都傳遞並返回結構對象,而是可以在結構本身內部添加這些對象,而可以創建Student對象並在同一函數中調用read和print函數。

struct Student
{
    char name[30];
    int age;
    double gpa;
    string department;

    Student(): age(0), gpa(0)
    {
        memset( name, 0, 30 );
    }

    void read()
    {
        cout << "\nName (30 characters maximum): ";
        cin.get(name, 30);
        cout << "\nAge: ";
        cin >> age;
        cout << "\nDepartment: ";
        cin >> department;
        cout << "\nGPA: ";
        cin >> gpa;
    }
    void print()
    {
        cout << "\n***************************************************************" << endl;
        cout << "Name: " << name << endl;
        cout << "Age: " << age << endl;
        cout << "Department: " << department << endl;
        cout << "GPA: " << gpa << endl;
    }
};

int main()
{
    Student s1;
    s1.read();
    s1.print();
    return 0;
}

您正在將s1的副本傳遞到read_data函數中,但不必費心根據返回arg更新值。 即這樣的事情應該工作。

s1 = read_data(s1);
print_data(s1);

或者,通過引用而不是值傳遞:

void read_data(Student& x)
{
    cout << "Name (29 characters maximum): "; // requires null terminator
    cin >> x.name; // just read into the buffer directly
    cout << "Age: ";
    cin >> x.age;
    cout << "Department: ";
    cin >> x.department;
    cout << "GPA: ";
    cin >> x.gpa;
}

然后再:

read_data(s1);
print_data(s1);

用這樣的東西改變你的read_data

void read_data(Student& x)
{
    cout << "Name (30 characters maximum): ";
    ///cin.get(x.name, 30);
    cin.getline(x.name, 30);
    cout << "Age: ";
    cin >> x.age;
    cin.ignore();
    cout << "Department: ";
    std::getline(cin, x.department);
    ///cin >> x.department;
    cout << "GPA: ";
    cin >> x.gpa;
    cin.ignore();
    // return x; can't return a value from a void function
}

在主函數中或在調用read_data函數的地方使用

Student s1, s2, s3;

cout << "This program stores -Temporarily- data of three students\n" << endl;

cout << "Enter 1st student's data" << endl;

read_data(s1);
read_data(s2);
read_data(s3);

您得到奇怪值的原因是您使用cin >>捕獲了緩沖區,而不是getline看到了

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM