我刚刚开始学习C,现在面临一些问题。我想创建一个小型地址簿。理论很简单:使用地址簿逻辑创建结构并初始化此结构的字段。
这是我的结构:
typedef struct {
char name[20];
char first_name[15];
char number[15];
} t_person;
这是全球性的。在我的main函数中,我创建了一个字段/数组:
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 :(得分:4)
您需要在特定索引处添加,以便您可以像这样传递 -
addEntry(&persons[i]); // Passing the Array to the Function
// start i from 0 to n-1 (for example)
此索引i
将在调用函数本身时更改。因此,您不需要在函数addEntry
中跟踪索引并担心它。
而不是使用gets
使用fgets
-
fgets(persons->name,sizeof persons->name,stdin);
同样适用于您的函数addEntry
中的所有内容。
如何修改我的函数以接受
t_person
数组而不使其成为全局数组。我想在我的主要功能中处理这个问题。
你不需要让它全球化。在main
中声明它,然后将它传递给你的函数。
答案 1 :(得分: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;
}