底部解决。
我有一个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);