繁体   English   中英

在ANSI C中使用数组和指针

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM