Hi, I am writing a contact book program using linked lists and I want to fill the
elements of the lists character by character. The reason I want to do it char by char
is to allow spaces when I store strings for example when someone has a first name
like Bobby Joe or when entering an address like 123 Any Street.
Is this possible?
I know how to add strings without spaces, but my attempt at char by char is
resulting in Seg faults.
Here is my attempt:
Code:
include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
struct contact //structure declaration
{
char fname[41]; //stores contacts first names
char lname[41]; //stores contacts last names
char address[101]; //stores contacts address
char pcode[7]; //stores contacts postal code
char phone[11]; //stores contacts phone number
struct contact *ptrNext; //self-referential pointer
};
typedef struct contact Con; //type declaration
//declare global variables
struct contact *ptrFirst = NULL;
struct contact *ptrLast = NULL;
//function prototypes
struct contact *CreateCon();
struct contact *InputCon(Con *ptrNew);
void AddNew(Con *ptrNew);
int isEmptyList();
struct contact *InputCon(struct contact *ptrNew)
{
char c; //stores characters
int pos; //array position variable
int spcount; //space counter
int digcount; //digit counter
fflush(stdin); //flush the input buffer
printf("FIRSTNAME: "); //prompt the user
pos = 0; //reset counters
spcount = 0;
digcount = 0;
while( ( c = getchar() ) != '\n' ) //do until user hits enter
{
ptrNew->fname[pos] = c;
if( isspace(&ptrNew->fname[pos]))
{
spcount++; //if its a space, count it
}
if( isdigit(&ptrNew->fname[pos]))
{
digcount++; //if its a digit count it
}
pos++; //increment the position
//check the limit of the field
if(pos>39)
{
break; //if you reach the limit break
}
}
ptrNew->fname[pos] = '\0'; //add string terminator
.
.
....roughly the same for last name, address, postal code and phone.
}
//Add new contact data interactively from the keyboard
//Input: a self-referencing pointer to the new instance
//Output: stores the data into the structure at that instance
void AddNew(Con *ptrNew)
{
if (isEmptyList())
{
ptrFirst = ptrNew;
ptrLast = ptrNew;
}
else
{
ptrNew->ptrNext = ptrFirst;
ptrFirst = ptrNew;
}
}
//check to see if the List is Empty
//Input: none
//Output: a boolean value for true or false
int isEmptyList()
{
if(ptrFirst == NULL)
return 1;
else
return 0;
}
//function call in the program looks like...
case 1: // user typed 1 Add New Contact
while((another == 'Y') || (another == 'y'))
{
another = 0;
AddNew(InputCon(CreateCon())); //function call
num++; //increment number of contacts
//let the user know the contact was added
printf("\nThe contact was added successfully.\n");
fflush(stdin); //flush the input buffer
//prompt the user for input
printf("\nAdd another contact? (Yes = y, No = Any Key)\n");
another = getchar(); //get user input
}
Any ideas how I can make this work? I would really appreciate some insight.
I'm not looking for a fully coded solution, psuedocode that points me in the right
direction would be great. I just don't know how to use the pointers right to
correctly store the value.