-1

我正在尝试为有关结构的分配创建一个程序。这个想法是创建一个包含名字和姓氏、电话号码和电子邮件地址的变量的结构。我认为我的大部分代码都还可以——与 C 的现代编码标准相比,这可能是基本的,但这是我在课堂上的位置。

无论如何,我在尝试初始化电子邮件地址字段的 5 行中遇到编译错误,指出分配中的类型不兼容。但是,我在名字或姓氏字段上没有收到这些错误,我不明白为什么。

非常感谢您对为什么会发生这种情况的任何想法或程序其余部分的错误!在修复此编译错误之前,我无法真正调试其余部分,所以我不确定还有什么问题。

#include <stdio.h>
#include <string.h>

/*****************************************
Structure declaration, creating type cont
*****************************************/

typedef struct contact {
  char fname[20];
  char lname[20];
  int number[10];
  char email[30];
} cont;

/*****************************************
Start of main function
*****************************************/
int main() {

int iMenu; //variable required for the menu
int iStorage; //variable used to store array entry chosen by the user
int iEntry1, iEntry2, iEntry3, iEntry4, iEntry5 = 0; //variables used for flagging assigned entries
/*******************************************
because of the typedef declaration, the struct command 
isn't necessary in creating an instance of the structure.
*******************************************/
cont myContact[4]; 

/*******************************************
we initialize the arrays contained within the structures
*******************************************/

  strcpy(myContact[0].fname, "\0");
  strcpy(myContact[0].lname, "\0");
  myContact[0].number = 0;
  strcpy(myContact[0].email, "\0");
  strcpy(myContact[1].fname, "\0");
  strcpy(myContact[1].lname, "\0");
  myContact[1].number = 0;
  strcpy(myContact[1].email, "\0");
  strcpy(myContact[2].fname, "\0");
  strcpy(myContact[2].lname, "\0");
  myContact[2].number = 0;
  strcpy(myContact[2].email, "\0");
  strcpy(myContact[3].fname, "\0");
  strcpy(myContact[3].lname, "\0");
  myContact[3].number = 0;
  strcpy(myContact[3].email, "\0");
  strcpy(myContact[4].fname, "\0");
  strcpy(myContact[4].lname, "\0");
  myContact[4].number = 0;
  strcpy(myContact[4].email, "\0");


/*****************************************
Creation of the menu to allow the users
to add entries or view them
*****************************************/
while (iMenu != 3) {
printf("Please select one of the following menu options: \n");
printf("\n1. Input new entries into the phonebook");
printf("\n2. View entries stored in the phonebook");
printf("\n3. Exit the Program\n");
scanf("%d", &iMenu);

/*******************************************
First menu option allows the selection of which
entry, and the storage of phonebook data
********************************************/
  if (iMenu == 1) {
    printf("Please input the entry in the phonebook you wish to change (0-4): \n");
    scanf("%d", iStorage);
    printf("Please input the first name of your new contact: \n");
    scanf("%s", myContact[iStorage].fname);
    printf("Please input the last name of your new contact: \n");
    scanf("%s", myContact[iStorage].lname);
    printf("Please input the phone number of your new contact: \n");
    scanf("%d", myContact[iStorage].number);
    printf("Please input the e-mail address of your new contact: \n");
    scanf("%s", myContact[iStorage].email);

    /**************************************
    Nested if statement sets the variable to
    flag if an entry has been made
    **************************************/
    if (iStorage == 0)
      iEntry1 = 1;
    else if (iStorage == 1)
      iEntry2 = 1;
    else if (iStorage == 2)
      iEntry3 = 1;
    else if (iStorage == 3)
      iEntry4 = 1;
    else if (iStorage == 4)
      iEntry5 = 1;
  }

  /***************************************
  Menu option 2 allows the user to display
  stored phonebook entries, using the iEntry
  variables as flags to determine which ones
  to display
  ***************************************/
  else if (iMenu == 2) {
    if (iEntry1 == 1)
      printf("%s %s phone number: %d e-mail address: %s", myContact[0].fname, myContact[0].lname, myContact[0].number, myContact[0].email);
    if (iEntry2 == 1)
      printf("%s %s phone number: %d e-mail address: %s", myContact[1].fname, myContact[1].lname, myContact[1].number, myContact[1].email);
    if (iEntry3 == 1)
      printf("%s %s phone number: %d e-mail address: %s", myContact[2].fname, myContact[2].lname, myContact[2].number, myContact[2].email);
    if (iEntry4 == 1)
      printf("%s %s phone number: %d e-mail address: %s", myContact[3].fname, myContact[3].lname, myContact[3].number, myContact[3].email);
    if (iEntry5 == 1)
      printf("%s %s phone number: %d e-mail address: %s", myContact[4].fname, myContact[4].lname, myContact[4].number, myContact[4].email);
  }
  else if (iMenu > 3) {
    printf("Invalid Entry.");
  }
}


return 0;
}
4

2 回答 2

3

您的编译器几乎肯定会抱怨这些行:

myContact[0].number = 0;
myContact[1].number = 0;
...

不是这些:

strcpy(myContact[0].email, "\0");
strcpy(myContact[1].email, "\0");
...

struct contact将其number字段声明为 type int[10],但您试图为其分配一个int

其他不请自来的建议:

myContact您可以更简单地初始化您的数组:

cont myContact[4] = { { { 0 } } };

当您初始化聚合类型的一部分(例如数组, a struct)时,编译器将自动对其所有剩余成员进行零初始化。例如,如果您有:

char s[100] = "hello";

那么前五个字节s将为'h', 'e', 'l', 'l', 'o', 其余 95 个字节中的每一个都将具有值 0。

int iEntry1, iEntry2, iEntry3, iEntry4, iEntry5 = 0;

这仅初始化iEntry5 = 0. iEntry1..iEntry4未初始化,这可能不是您想要的。

打印输入提示时,您应该调用fflush(stdout)after

另外,不要使用scanf. 它容易出错并且难以正确使用。您特别需要关注缓冲区溢出。

于 2013-03-16T05:26:48.837 回答
2

每个联系人都有十个号码(int number[10],从 0 到 9),您正在分配,就好像它很简单int number

myContact[0].number = 0;

另外,不要这样做: strcpy(myContact[0].fname, "\0");

您可能想要“”,而不是“\0”,因为字符串末尾总是有一个隐含的 \0。

(我希望 fname 和 lname 只是作为练习。世界上许多人的名字不符合“名字 - 姓氏”范式)

于 2013-03-16T05:26:37.310 回答