#include #include char * copy_string(char * input) { int length = 0; while(input[length] != 0) { length++; } char * result = (char *) malloc(sizeof(char) * (length + 1)); int i; for (i = 0; i <= length; i++) { result[i] = input[i]; } return result; } struct phone_entry { char * name; char * phone; }; struct phonebook { int max_entries; int current_entries; phone_entry * entries; }; struct phonebook initialize_phonebook(int max_entries) { struct phonebook result; result.max_entries = max_entries; result.current_entries = 0; result.entries = (phone_entry *) malloc(sizeof(phone_entry) * max_entries); return result; } // asks the user to enter the name and number for some person // to be fixed. void enter_number(struct phonebook * my_book) { if (my_book->current_entries >= my_book->max_entries) { printf("you surpassed the maximum number of entries\n"); } char * buffer = (char *) malloc(sizeof(char) * 1000); struct phone_entry entry; printf("please enter name\n"); scanf("%s", buffer); entry.name = copy_string(buffer); printf("please enter phone\n"); scanf("%s", buffer); entry.phone = copy_string(buffer); my_book->entries[my_book->current_entries] = entry; my_book->current_entries++; free(buffer); } void print_phonebook(phonebook my_book) { printf("\nall phone entries:\n"); int i; for (i = 0; i < my_book.current_entries; i++) { printf("entry %d\n", i); printf("name: %s\n", my_book.entries[i].name); printf("number: %s\n", my_book.entries[i].phone); printf("\n"); } } char * get_filename() { return "phones.txt"; } int save_phonebook(struct phonebook * my_book) { char * filename = get_filename(); FILE * file = fopen(filename, "w"); if (file == 0) { printf("could not open file %s for writing\n", filename); return 0; } int i; for (i = 0; i < my_book->current_entries; i++) { fprintf(file, "%s %s\n", my_book->entries[i].name, my_book->entries[i].phone); } fclose(file); return 1; } int load_phonebook(struct phonebook * my_book) { char * filename = get_filename(); FILE * file = fopen(filename, "r"); if (file == 0) { printf("could not open file %s for reading\n", filename); return 0; } my_book->current_entries = 0; char * buffer = (char *) malloc(sizeof(char) * 1000); int success = 1; while(1) { phone_entry entry; int items = fscanf(file, "%s", buffer); if (items != 1) { break; } if (my_book->current_entries >= my_book->max_entries) { printf("phonebook capacity has been exceeded, cannot store phone number for %s\n", buffer); success = 0; break; } entry.name = copy_string(buffer); items = fscanf(file, "%s", buffer); if (items != 1) { printf("failed to read phone number for name %s\n", entry.name); success = 0; free(entry.name); break; } entry.phone = copy_string(buffer); my_book->entries[my_book->current_entries] = entry; my_book->current_entries++; } fclose(file); free(buffer); return success; } int string_equal(char * a, char * b) { int i = 0; while(1) { if ((a[i] == 0) && (b[i] == 0)) { return 1; } else if ((a[i] == 0) || (b[i] == 0)) { return 0; } else if (a[i] != b[i]) { return 0; } i++; } } void search_name(struct phonebook * book) { char * buffer = (char *) malloc(sizeof(char) * 1000); printf("enter name to search for:\n"); scanf("%s", buffer); int i; for (i = 0; i < book->current_entries; i++) { struct phone_entry entry = book->entries[i]; if (string_equal(entry.name, buffer)) { printf("entry %d\n", i); printf("name: %s\n", book->entries[i].name); printf("number: %s\n", book->entries[i].phone); printf("\n"); } } } int main() { int max_entries = 100; struct phonebook book = initialize_phonebook(max_entries); if (load_phonebook(&book) == 0) { printf("failed to load phonebook\n"); book = initialize_phonebook(max_entries); } while(1) { int choice; printf("\n1. enter a new number\n"); printf("2. print all entries\n"); printf("3. save to a file\n"); printf("4. search name\n"); printf("0. exit\n"); printf("enter your choice:\n"); scanf("%d", &choice); switch(choice) { case 0: exit(0); break; case 1: enter_number(&book); break; case 2: print_phonebook(book); break; case 3: save_phonebook(&book); break; case 4: search_name(&book); break; default: printf("%d is not a valid choice\n", choice); break; } } }