0

contactList.txt を読み取るポインターを使用して関数によって操作される二重リンク リストを使用して、連絡先マネージャーをコーディングしています。

#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<process.h>
#include<stdlib.h>
#include<dos.h>

//functions
listelement * getFirst(listelement *listpointer,string query[MAX]);
void getLast();
void getEmail();
void getCompany();
void getNumber();
void editCon();
void delCon();
void addCon();
void listAll();
void sortCon();
void Menu (int *choice);

#define MAX 20
//struct to order contactList
struct contact
{
    string firstName[MAX],lastName[MAX],email[MAX],companyName[MAX];
    long phoneNum[MAX];
    struct listelement *link
    struct contact *next;
    struct contact *prev;

}list;



int main()
{
    listelement listmember, *listpointer;
    string query;int iChoice = 0;
    listpointer = NULL;


    Menu (&iChoice);
    int iChoice;

    fflush(stdin);
    scanf_s("%d", &iChoice);
    // user enters one of 9 values
    // options are as follows: get first name,last name,list all contacts,search through contacts,add a new contact,edit/delete or sort contacts.
    switch(iChoice)
    {
        case 1:     
        {
            printf ("Enter contact first name to get details  ");
            scanf ("%d", &query);
            listpointer = getFirst (listpointer, query);
            break;
        }
        case 2:     
        {
            getLast();
            break;
        }
        case 3:     
        {
            listAll();
            break;
        }
        case 4:     
        {
            getEmail();
            break;
        }
        case 5:     
        {
            getCompany();
            break;
        }
        case 6:     
        {
            getNumber();
            break;
        }
        case 7:     
        {
            addCon();
            break;
        }
        case 8:     
        {
            editCon();
            break;
        }
        case 9:     
        {
            delCon();
            break;
        }
        case 10:        
        {
            sortCon();
            break;
        }
        case 11:        // exit
        {
            printf("\n\nProgram exiting!...");
            exit(0);//terminates program
            break;
        }
        default:
        printf ("Invalid menu choice - try again\n");
        break;

    }//end of switch
    return(iChoice);


}//end of main
//menu function to test if invalid input was entered in a menu choice.
void Menu (int *iChoice)
{
    char    local;

    system("cls");
    printf("\n\n\t\\n\n");
    printf("\n\n\t\tWelcome to my Contact Manager\n\n");
    printf("\n\t\t1. First name");
    printf("\n\t\t2. Last name");
    printf("\n\t\t3. List all contacts");
    printf("\n\t\t4. Search email");
    printf("\n\t\t5. Search company name");
    printf("\n\t\t6. Search number");
    printf("\n\t\t7. Add contact");
    printf("\n\t\t8. Edit contact");
    printf("\n\t\t9. Delete contact");
    printf("\n\t\t10. Sort contacts");
    printf("\n\t\t11. Exit");
    printf("\n\n\t\tEnter your menu choice: ");

    do
    {
    local = getchar ();
    if ( (isdigit(local) == FALSE) && (local != '\n') )
        {
        printf ("\nYou must enter an integer.\n");
        printf ("");
    }
    } while (isdigit ((unsigned char) local) == FALSE);

    *iChoice = (int) local - '0';
}

//function to get a contact by entering first name
listelement * getFirst (listelement *listpointer, string query)
{
    //variables
    char query[MAX],firstName[MAX];
    FILE *fp, *ft;
    int i,n,ch,l,found;

    system("cls");
    do
    {
    found=0;


    l=strlen(query);
    fp=fopen("ContactList.txt","r");

    system("cls");
    printf("\n\n..::Search result for '%s' \n===================================================\n",query);
    while(fread(&list,sizeof(list),1,fp)==1)
    {
    for(i=0;i<=l;i++)
    firstName[i]=list.firstName[i];
    firstName[l]='\0';
    if(stricmp(firstName,query)==0)
    {
    printf("\n..::First Name\t: %s\n..::Second Name\t: %ld\n..::Email\t: %s\n..::CompanyName\t:  %s\n..::Number\t:  %s\n",list.firstName,list.lastName,list.email,list.companyName.list.phoneNumber);
    found++;
    if (found%4==0)
    {
    printf("..::Press any key to continue...");
    getch();
    }
    }
    }

    if(found==0)
    printf("\n..::No match found!");
    else
    printf("\n..::%d match(s) found!",found);
    fclose(fp);
    printf("\n ..::Try again?\n\n\t[1] Yes\t\t[11] No\n\t");
    scanf("%d",&ch);
    }while(ch==1);



}

コードのどこが間違っているのか、誰にも分かりますか?ありがとう

4

1 に答える 1

4

エラーの理由は次のとおりです。

listelement1)どこにも定義しない

2)どこにも定義しないstring(そしてそれはCのタイプではない)

3)使用する前に#define MAX、上に移動する必要があります。

4)あなたはどこにも定義しませんFALSE(そしてそれはCのタイプではありません)

5)要素も再定義しています。 「文字列」としてgetFirst()渡した後、newをchar配列として定義します。queryquery

6)複数の定義があるため、再定義エラーが発生します。それはやや#5ですが、それ以上のものもあります。あなたのメインであなたはiChoiceここで宣言します:string query;int iChoice = 0; それからあなたは電話int iChoice;の直後にそれを再び宣言しますyour Menu()

fflush(stdin)7) C標準による未定義の動作をしないでください

于 2013-03-13T19:46:02.193 に答える