#include #include #include #define MAX_NAME_LENGTH 100 #define MAX_ADDRESS_LENGTH 1000 struct Person { char* address; char* name; int phone; }; void flush() { while( getchar() != '\n' ) {} } void printPerson( struct Person* person ) { printf( "Name: %s\nAddress: %s\nPhone: %i\n", person->name, person->address, person->phone ); } void printPeople( struct Person** people, int numPeople ) { int x; for( x = 0; x < numPeople; x++ ) { printPerson( people[ x ] ); printf( "\n" ); } } char* copyString( char* string ) { char* retval = calloc( sizeof( char ), strlen( string ) + 1 ); strcpy( retval, string ); return retval; } void readString( char* buffer, int bufferLength ) { int len; fgets( buffer, bufferLength, stdin ); len = strlen( buffer ); if ( buffer[ len - 1 ] == '\n' ) { buffer[ len - 1 ] = '\0'; } } char* readAddress() { char buffer[ MAX_ADDRESS_LENGTH ]; printf( "Enter address: " ); readString( buffer, MAX_ADDRESS_LENGTH ); return copyString( buffer ); } char* readName() { char buffer[ MAX_NAME_LENGTH ]; printf( "Enter name: " ); readString( buffer, MAX_NAME_LENGTH ); return copyString( buffer ); } int readPhone() { int input = -1; printf( "Enter phone number: " ); scanf( "%i", &input ); flush(); return input; } struct Person* readPerson() { struct Person* retval = malloc( sizeof( struct Person ) ); retval->name = readName(); retval->address = readAddress(); retval->phone = readPhone(); return retval; } int yesNoPrompt() { int retval = -1; do { printf( "Continue? (y/n) " ); switch ( getchar() ) { case 'Y': case 'y': retval = 1; break; case 'N': case 'n': retval = 0; break; default: printf( "Please enter 'y' or 'n'.\n" ); } flush(); } while ( retval == -1 ); return retval; } struct Person** readPeople( int* numPeople ) { struct Person** retval = NULL; int numRead = 0; do { numRead++; retval = realloc( retval, sizeof( struct Person* ) * numRead ); retval[ numRead - 1 ] = readPerson(); } while( yesNoPrompt() ); *numPeople = numRead; return retval; } void freePerson( struct Person* person ) { free( person->address ); free( person->name ); free( person ); } void freePeople( struct Person** people, int numPeople ) { int x; for( x = 0; x < numPeople; x++ ) { freePerson( people[ x ] ); } free( people ); } int main() { int numPeople = 0; struct Person** people = readPeople( &numPeople ); printPeople( people, numPeople ); freePeople( people, numPeople ); return 0; }