使用ANSI C中的数组和指针

时间:2015-11-18 13:10:17

标签: c arrays pointers

我刚刚开始学习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数组而不使它成为全局数据。我想在我的主要功能中处理这个问题。

给我的任何提示?

2 个答案:

答案 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;
}