C向数组添加其他结构的函数无法正确添加多个结构

时间:2019-04-02 14:47:40

标签: c memory struct dynamic-arrays ansi

底部解决。

我有一个C程序,用于保存,编辑和删除联系人并将其保存到二进制文件中。联系人的结构定义如下:

Smooch.init({...})
    .then(function() {
        Smooch.open() 
    });

除了phone_number之外的每个值都保存了信息在文件中的位置,信息随后被写入。现在,当程序运行时,我将所有联系人读入动态数组。以下功能旨在向阵列添加一个附加联系人并进行存储。但是,当我从零个联系人开始并添加一个时,就可以了。但是,当我尝试添加第二个联系人时,它似乎与第一个联系人重叠,并导致程序读取了错误的信息。

我相信这与我的realloc语句有关,尽管我不知道有什么问题。我试图创建第二个数组并重新分配给该数组,但这也失败了。

    struct Contact {
        unsigned long phone_number;
        long first_name_posn;
        long last_name_posn;
        long company_name_posn;
        long email_posn;
        long next;
    }

如果我输入这两个联系人:

名字:约翰

姓氏:Smith

公司:Rick's

电话:1234567899

电子邮件:jsmith@hotmail.com

名字:Bob

姓氏:常绿

公司:

电话:5194567895

电子邮件:bobgreen@gmail.com

这将删除John的名字,并将电话号码更改为6445449192,其他保持不变。 对于第二个联系人,所有信息均为“ om”,电话号码为64。

为解决此问题,我已将参数更改为:

int addContact(Contact *contacts, FILE *fptr, int size)
{
    char *fName, *lName, *company, *email;
    unsigned long phone;
    long next;
    char input[MAX_STRING_SIZE];

    /* Gets the first name */
    printf("First Name: ");
    fgets(input, MAX_STRING_SIZE, stdin);
    fName = toPointer(input);

    /*Gets the last name or company name */
    do
    {
        printf("Last Name: ");
        fgets(input, MAX_STRING_SIZE, stdin);
        lName = toPointer(input);

        printf("Company Name: ");
        fgets(input, MAX_STRING_SIZE, stdin);
        company = toPointer(input);

    } while ((lName[0] == '\0' || lName[0] == '\n') && (company[0] == '\0' || company[0] == '\n'));

    /* Gets the phone number */
    do
    {
        printf("Phone Number (enter only numbers): ");
        fgets(input, MAX_STRING_SIZE, stdin);

        if (input[0] != '\0' && input[0] != '\n')
        {
            sscanf(input, "%ld", &phone);
        }
    } while ((phone < 1000000 || phone > 9999999) && (phone < 1000000000 || phone > 9999999999));

    do
    {
        printf("Email: ");
        fgets(input, MAX_STRING_SIZE, stdin);
        email = toPointer(input);

    } while (!isValidEmail(email));

    printf("Action: ");
    fgets(input, MAX_STRING_SIZE, stdin);
    lowerCase(input);

    if (input[0] == 's' && input[1] == '\0')
    {
        next = getNext(fptr);
        printf("Size: %d\n", size);
        contacts = realloc(contacts, sizeof(Contact) * (size+1));
        fseek(fptr, 0, SEEK_END);

        /* Calculates the position for the contact */
        contacts[size].phone_number = phone;
        contacts[size].first_name_posn = next + sizeof(Contact);
        contacts[size].last_name_posn = next + sizeof(Contact) + (sizeof(char) * (strlen(fName)+1));
        contacts[size].company_name_posn = next + sizeof(Contact) + (sizeof(char) * (strlen(fName)+1)) + (sizeof(char) * (strlen(lName)+1));
        contacts[size].email_posn = next + sizeof(Contact) + (sizeof(char) * (strlen(fName)+1)) + (sizeof(char) * (strlen(lName)+1)) + (sizeof(char) * (strlen(company)+1));
        contacts[size].next = next + sizeof(Contact) + (sizeof(char) * (strlen(fName)+1)) + (sizeof(char) * (strlen(lName)+1)) + (sizeof(char) * (strlen(company)+1)) + (sizeof(char) * (strlen(email)+1));

        fwrite(&contacts[size], sizeof(Contact), 1, fptr);
        fwrite(fName, sizeof(char) * (strlen(fName)+1), 1, fptr);
        fwrite(lName, sizeof(char) * (strlen(lName)+1), 1, fptr);
        fwrite(company, sizeof(char) * (strlen(company)+1), 1, fptr);
        fwrite(email, sizeof(char) * (strlen(email)+1), 1, fptr);

        size++;
    }

    free(fName);
    free(lName);
    free(company);
    free(email);

    return size;
}

然后在if语句中,我对写作进行了调整。添加了一个临时联系人以添加信息,并添加了另一个联系人以将旧数组复制到具有更多空间的新数组。然后,我从一个联系人复制到另一个联系人以更新阵列。这里是更改的地方:

int addContact(Contact **contacts, FILE *fptr, int size);

0 个答案:

没有答案