Building a phonebook program for school--very much a work in progress. I still need to write a sort function, tweak my delete function, etc. But actually what I'm hoping you folks could answer is hopefully simpler--for some reason I seem to have a while loop that is executing twice, and I can't figure out why.
When you try to do any function, like after adding a user...the menu prints twice. Any ideas what's going on?
See code (line 24 is where the while loops starts that I think is the problem):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct PhoneBookContacts
{
char Name[20]; //Entered First Name
char Surname[20]; //Entered Last Name
char PhoneNumber[20]; //Phone Number
} phone;
void AddEntry (phone * ); //Function prototype to Add Entries
void DeleteEntry (phone * ); //Function prototype to Delete Entries
void PrintEntry (phone * ); //Function prototype to Display Entries
int counter = 0; //Global counter variable used to keep track of number of contacts
//Begin main function
int main (void)
{
phone *phonebook; //Phonebook instance
phonebook = (phone*) malloc(sizeof(phone)*1); //Allocate memory for contacts
char userChoice; //Variable to use to select menu choice
while (userChoice == 'A'||'D'||'S'||'P'||'Q'||'Z')
{
printf ("***************\n");
printf ("Please enter a command:\n");
printf("'A': Add an entry\n");
printf("'D': Delete an entry\n");
printf("'S': Sort entries\n");
printf("'P': Print the phonebook\n");
printf("'Q': Quit\n");
printf ("***************\n");
scanf("%c", &userChoice); //Stores menu choice into variable iSelection
// Add Contact
if (userChoice == 'A')
{
AddEntry(phonebook);
}
//Remove Contact
if (userChoice == 'D')
{
DeleteEntry (phonebook);
}
//Print Contacts
if (userChoice == 'P')
{
PrintEntry(phonebook);
}
//Quit
if (userChoice == 'Q')
{
printf("Phonebook will now quit.");
return 0;
}
}
}
//Function Definition to Add Contacts to the Phonebook
void AddEntry (phone * phonebook)
{
counter++; //global counter increase
realloc(phonebook, sizeof(phone));
printf("\nFirst Name: ");
scanf("%s", phonebook[counter-1].Name); //counter-1 b/c arrays start at 0
printf("Last Name: ");
scanf("%s", phonebook[counter-1].Surname);
printf("Phone Number (XXX-XXX-XXXX): ");
scanf("%s", phonebook[counter-1].PhoneNumber);
printf("\n%s added to phonebook\n", phonebook[counter-1].Name); //tell user friend added
}
void DeleteEntry (phone * phonebook)
{
int x = 0;
char deleteName[20]; // Temp string to compare to existing phonebook
char deleteSurname[20]; //temp string
char nullStr[20] = {"\0"}; // empty string to remove phonenumber
printf("\nEnter name: ");
scanf("%s", deleteName); //place into temp string
printf("Enter Surname: ");
scanf("%s", deleteSurname); //place into temp string
for (x = 0; x < counter; x++)
{
if (strcmp(deleteName, phonebook[x].Name) == 0) //compare deleteName to phonebook.Name
{
for (x = 0; x < counter; x++)
{
if (strcmp(deleteSurname, phonebook[x].Surname) == 0) //If deleteSurname matches phonebook.Surname
{
strcpy(phonebook[x].Name, nullStr); //Put null into Name
strcpy(phonebook[x].Surname, nullStr); //Null into Surname
strcpy(phonebook[x].PhoneNumber, nullStr); //Null into PhoneNumber
printf("Contact removed from phonebook.\n");
counter--;
break;
}//End inner If
else
{
printf("Invalid Entry.\n");
}
}
printf("Not a valid entry.\n");
}
}
printf("Fail. try again.\n");
}
// Function def to print contacts
void PrintEntry (phone * phonebook)
{
int x = 0;
printf("\nPhonebook entries:\n");
for( x = 0; x < counter; x++)
{
printf("\n(%d)\n", x+1); //Show contact number
printf("Name: %s %s\n", phonebook[x].Name, phonebook[x].Surname); //Name
printf("Number: %s\n", phonebook[x].PhoneNumber); //Number
}
}