[英]Working with Arrays and Pointers in ANSI C
我刚刚开始学习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数组,而不必使其成为全局数组。 我想在我的主要职能。
对我有什么提示吗?
您需要添加特定的索引,这样您才能通过-
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
所有addEntry
。
如何修改我的函数以接受
t_person
数组而无需使其成为全局数组。 我想在我的主要职能。
您无需使其全球化。 在main
声明它,然后将其传递给您的函数。
您可以将persons
声明为数组,并可以使用addEntry(&persons[i]);
对其进行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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.