address2.c:


#include <stdlib.h>

struct address
{
    char *street;
    char *city;
    char *province;
    char *postal_code;
};

struct address *new_address()
{
    struct address *temp = (struct address *) malloc(sizeof(struct address));
   
    temp->street = NULL;
    temp->city = NULL;
    temp->province = NULL;
    temp->postal_code = NULL;
   
    return temp;
}

void set_string(char **str, char *value)
{
    if (*str != NULL)
    {
        free(*str);
    }

    *str = (char*) malloc( sizeof(char) * (strlen(value) + 1) );
    strcpy(*str, value);
}

void set_street(struct address *add, char *value)
{
    set_string(&add->street, value);
}

void set_city(struct address *add, char *value)
{
    set_string(&add->city, value);
}

void set_province(struct address *add, char *value)
{
    set_string(&add->province, value);
}

void set_postal_code(struct address *add, char *value)
{
    set_string(&add->postal_code, value);
}

int main(int argc, char **argv)
{
    if (argc < 5)
    {
        printf("Usage: %s street city province postal_code\n", argv[0]);
        exit(1);
    }

    struct address *my_address = new_address();

    set_street(my_address, argv[1]);
    set_city(my_address, argv[2]);
    set_province(my_address, argv[3]);
    set_postal_code(my_address, argv[4]);
   
    printf("Address is:\n\t%s\n\t%s, %s\n\t%s\n",
        my_address->street,
        my_address->city,
        my_address->province,
        my_address->postal_code);
}