2015-05-03 76 views
-2

我在這裏有一個簡單的練習。我已經創造了structure.c的結構如下:結構和功能的C編程

struct student { 
    char *first; 
    char *last; 
    string name; 
    int id; 
    double GPA; 
}; 

我需要拿出具有以下功能和在同一文件中定義它:

setName(char* name[size]) 

getName() 

setID() 

setGPA(double GPA) 

getGPA() 

我不明白我怎麼樣如果結構尚未初始化,m假設創建setter和getter。我猜我使用指針,但我不確定如何在C中如何做。

然後我應該在頭文件中聲明/列出所有這些函數,這一點我也很困惑。

回答

1

你需要傳遞一個poitner的結構,每個二傳手/ getter函數,例如

void 
student_set_first_name(struct student *student, const char *const name) 
{ 
    size_t length; 
    if ((student == NULL) || (name == NULL)) 
    { 
     fprintf(stderr, "Invalid parameters for `%s()'\n"), __FUNCTION__); 
     return; 
    } 
    /* In case we are overwriting the field, free it before 
    * if it's NULL, nothing will happen. You should try to 
    * always initialize the structure fields, to prevent 
    * undefined behavior. 
    */ 
    free(student->first); 

    length = strlen(name); 
    student->first = malloc(1 + length); 
    if (student->name == NULL) 
    { 
     fprintf(stderr, "Memory allocation error in `%s()'\n"), __FUNCTION__); 
     return; 
    } 
    memcpy(student->first, name, 1 + length); 
} 

const char * 
student_get_first_name(struct student *student) 
    { 
    if (student == NULL) 
     return NULL; 
    return student->first; 
    } 

而且你可以使用函數這樣

struct student student; 
const char *first_name; 

memset(&student, 0, sizeof(student)); 
student_set_first_name(&student, "My Name"); 
first_name = student_get_first_name(&student); 
if (first_name != NULL) 
    fprintf(stdout, "First Name: %s\n", first_name); 
/* work with `student', and when you finish */ 
free(student.first); 
/* and all other `malloc'ed stuff */ 

的好處是,你可以隱藏庫用戶的結構定義,並防止他們濫用結構,如設置無效值和其他東西。

+0

偉大的職位謝謝,大大澄清了事情。我仍然對頭文件中應該做什麼感到困惑,因爲它涉及到使用它的功能。任何幫助? – bfalco

+0

搜索谷歌關於轉發聲明,只是提供一個'struct'和每個函數的原型,還有一些關於該主題的其他文章,其中之一是我的。 –