2015-11-18 35 views
0

我刚开始学习C,现在面临一些问题。我想创建一个小的地址簿。理论很简单:使用地址簿逻辑创建结构并初始化此结构的字段。使用ANSI数组和指针C

这是我的结构:

typedef struct { 
    char name[20]; 
    char first_name[15]; 
    char number[15]; 
} t_person; 

这是全球性的。在我的主要函数创建一个字段/阵列:

t_person persons[MAX_RECORDS]; // MAX_RECORDS = 30 

我面临着以下问题:我想调用一个函数,它处理逻辑添加新的人。但我很困惑与不会忽略/指针等

调用该函数:

addEntry(&persons); // Passing the Array to the Function 

本身的功能:

void addEntry(t_person *persons) 
{ 

    int i = 0; // I know this won't work, because adding 
       // a new person will overwrite the previous one 
       // Just for testing 

    printf("Name: "); 
    gets(&persons[i].name); 
    printf("First Name: "); 
    gets(&persons[i].first_name); 
    printf("Number: "); 
    gets(&persons[i].number); 
} 

我明白了,我的功能等待一个指针t_person,但我传递了一个t_person数组。但我不明白,如何修改我的函数来接受一个t_person数组,而不使其成为全局的。我想在我的主要功能中处理这个问题。

我的任何提示?

+0

的addEntry(人[0]); – Nunchy

+0

@Nunchy事实是&不是必需的,人们已经存储了struct数组的地址。如果将数组传递给函数,则在调用方函数中定义时,数组不需要是全局的。 –

+0

好吧......你说得对,这是不需要的 - 它可以工作,尽管如此 – Nunchy

回答

4

你需要在一个特定的指数加那么你可以通过这样的 -

addEntry(&persons[i]); // Passing the Array to the Function 
         // start i from 0 to n-1 (for example) 

该指数i将在调用函数本身被改变。因此,您不需要跟踪索引并在函数addEntry中担心索引。和

而是采用gets使用fgets - 在你的功能addEntry

fgets(persons->name,sizeof persons->name,stdin); 

同样,对于所有。

如何修改我的函数来接受一个t_person的数组而不使它成为一个全局的。我想在我的主要功能中处理这个问题。

您不需要使其成为全球。在main中声明它,然后将它传递给你的函数。

0

可以声明persons作为阵列和你可以把它使用addEntry(&persons[i]);与环上,则程序将是这样的:

#include <stdio.h> 

#define MAX_RECORDS 30 

typedef struct { 
    char name[20]; 
    char first_name[15]; 
    char number[15]; 
} t_person; 

void addEntry(t_person *persons) 
{ 
    //gets is deprecated because it's dangerous, it may cause buffer overflow, it recommanded to use fgets 
    printf("Name: "); 
    fgets(persons->name, sizeof(persons->name), stdin); 
    //gets(persons->name); 
    printf("First Name: "); 
    fgets(persons->first_name, sizeof(persons->first_name), stdin); 
    //gets(persons->first_name); 
    printf("Number: "); 
    fgets(persons->number, sizeof(persons->number), stdin); 
    //gets(persons->number); 
} 

int main (int argc, char **argv) 
{ 
    t_person persons[MAX_RECORDS]; // MAX_RECORDS = 30 
    int i = 0; 

    while(i < MAX_RECORDS) 
    { 
     addEntry(&persons[i]); 
     i++; 
    } 
    return 0; 
}