| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 | // names3.c -- use pointers and malloc()#include <stdio.h>#include <string.h>   // for strcpy(), strlen()#include <stdlib.h>   // for malloc(), free()#define SLEN 81struct namect {    char * fname;  // using pointers    char * lname;    int letters;};void getinfo(struct namect *);        // allocates memoryvoid makeinfo(struct namect *);void showinfo(const struct namect *);void cleanup(struct namect *);        // free memory when donechar * s_gets(char * st, int n);int main(void){    struct namect person;        getinfo(&person);    makeinfo(&person);    showinfo(&person);    cleanup(&person);        return 0;}void getinfo (struct namect * pst){    char temp[SLEN];    printf("Please enter your first name.\n");    s_gets(temp, SLEN);    // allocate memory to hold name    pst->fname = (char *) malloc(strlen(temp) + 1);    // copy name to allocated memory    strcpy(pst->fname, temp);    printf("Please enter your last name.\n");    s_gets(temp, SLEN);    pst->lname = (char *) malloc(strlen(temp) + 1);    strcpy(pst->lname, temp);}void makeinfo (struct namect * pst){    pst->letters = strlen(pst->fname) +    strlen(pst->lname);}void showinfo (const struct namect * pst){    printf("%s %s, your name contains %d letters.\n",           pst->fname, pst->lname, pst->letters);}void cleanup(struct namect * pst){    free(pst->fname);    free(pst->lname);}char * s_gets(char * st, int n){    char * ret_val;    char * find;        ret_val = fgets(st, n, stdin);    if (ret_val)    {        find = strchr(st, '\n');   // look for newline        if (find)                  // if the address is not NULL,            *find = '\0';          // place a null character there        else            while (getchar() != '\n')                continue;          // dispose of rest of line    }    return ret_val;}
 |