I am having troubles getting my sort function to sort properly. As written below the code functions well, but organizes all sorts in descending order. If I flip the inequality to display in ascending order, the program more or less stops working. The print function will no longer work, as well as not being able to add anything back in to the phone-book(array).
A second problem I am having is with the menu function. The menu displays properly initially. Then after a selection has been made, and we return to the for loop and run menu again, a selection is made automatically and sent to the else - invalid input. The menu is then displayed again. This happens every time a selection is made.
Any help would be greatly appreciated.
Below is the code.
#include <stdio.h>
#include <string.h>
//Structure for entries.
struct entry
{
char name[12];
char surname[12];
char number[12];
}entries[20];
//Menu for user entry.//
void menu()
{
printf("Make a selection:\n\n");
printf("-------------------------------\n");
printf(" (a) - Add an Entry\n");
printf(" (d) - Delete Entry\n");
printf(" (s) - Sort Entries\n");
printf(" (p) - Print the Phonebook\n");
printf(" (q) - Quit\n");
printf("-------------------------------\n");
}
//Add new entry to phonebook.
void add(int i)
{
printf("Please enter the first name of your entry.\n");
scanf("%s", entries[i].name);
printf("Please enter the surname of your entry.\n");
scanf("%s", entries[i].surname);
printf("Please enter the phone number of your entry.\n");
scanf("%s", entries[i].number);
}
//Delete entries from phonebook
void dlt()
{
int entry, up;
printf("Please enter the number of the entry you would like to delete.\n");
scanf("%i", &entry);
up=entry+1;
for(entry; entry<20; ++entry, ++up){
strcpy(entries[entry].name, entries[up].name);
strcpy(entries[entry].surname, entries[up].surname);
strcpy(entries[entry].number, entries[up].number);
}
}
//Function to print the phonebook.
void print()
{
int i;
for ( i = 0 ; i < 20; ++i)
{
if (strcmp(entries[i].name, "") != 0)
printf("[%i] First: %s\n Last: %s\n Number: %s\n\n", i, entries[i].name, entries[i].surname, entries[i].number);
else
break;
}
}
//Initialize entries to be ' '
void init()
{
int l;
for (l=0; l<20; ++l);
strcpy(entries[l].name, "");
}
//Sort entries based on given requirement.
void sort()
{
int choice;
int i=0, j=1;
struct entry temp;
printf("Select how you would like to sort your phonebook:\n");
printf(" (1) - sort by first name\n");
printf(" (2) - sort by surname\n");
printf(" (3) - sort by phone number\n");
scanf("%i", &choice);
print();
//Sort by first name.
if( choice == 1 )
{
for(i=0; i<19; ++i)
{
for(j=i+1; j<20; ++j)
{
if (strcmp(entries[i].name,entries[j].name) < 0 )
{
temp = entries[i];
entries[i] = entries[j];
entries[j] = temp;
}
}
}
}
//Sort by surname.
else if( choice == 2)
{
for(i=0; i<19; ++i)
{
for(j=i+1; j<20; ++j)
{
if (strcmp(entries[i].surname,entries[j].surname) < 0 )
{
temp = entries[i];
entries[i] = entries[j];
entries[j] = temp;
}
}
}
}
//Sort by number.
else if( choice == 3)
{
for(i=0; i<19; ++i)
{
for(j=i+1; j<20; ++j)
{
if (strcmp(entries[i].number,entries[j].number) < 0 )
{
temp = entries[i];
entries[i] = entries[j];
entries[j] = temp;
}
}
}
}
print();
return;
}
//Main function to call sub functions and organize program logic.
int main()
{
char entry = 'z';
int i;
init();
for (i=0; entry != 'q';)
{
menu();
scanf("%c", &entry);
//add
if (entry == 'a')
{
add(i);
++i;
}
//delete
else if (entry == 'd')
{
dlt();
--i;
}
//display phonebook
else if (entry == 'p')
print();
//quit
else if(entry == 'q')
return 0;
//sort
else if(entry == 's')
sort();
else
printf("Invalid input");
}
return 0;
}