help with c code

Douglas A. Lane laned at athena.ecs.csus.edu
Fri Jan 25 16:35:55 AEST 1991


B,

	This code performs what you requested.. hope it helps in your
quest to learn more about C.

	This compiles under BSD cc, Turbo C++ 1.0, ANSI C..

Doug

daLane (laned at athena.ecs.csus.edu) 
----------------------------------------------------------------------------
The opinions expressed are mine alone and do not reflect any 
organization unless noted.
============================================================================
"The best religion, is tolerance" 
"Take a stand, but not on my feet please." -me
----------------------------------------------------------------------------
  "Men are disturbed not by things that happen but by their opinion of
     things that happen."    Epictetus
----------------------------------------------------------------------------
SUPPORT OUR TROOPS !!  When they come home - welcome them, they deserve it.
------------------------------------------------------------------------------
Hussein did not come to negociate, neither did Bush
- anyone who thinks they would is a fool.
------------------------------------------------------------------------------

/* #define ANSIC */
/* #define TURBOC */
/*
 *   Purpose
 *
 * 	This program will read the input file of names and transpose
 * then into the form:
 * 	last, first, middle
 * 	or
 * 	last, first
 *
 * 	The input is in the form of:
 * [prefix] first [middle] last [suffix]
 *
 * 	The program will strip of a select number of suffixes and prefixes.
 * 	The program will ignore all blanks, but assumes the only delimiters
 * between the names are blanks (no commas allowed)
 *
 * ---------------------------------------------------------------------------
 * Sample file  ( "test" )
 * Mr. John J. Jackson
 * J. Johnson
 * Betty Smith
 * Charles Robinson Sr.
 * Charles Robinson Jr.
 * Cindy Ann West
 * Miss Cindy Ann West
 * Ms. Cindy West
 * Charle Emerson Winchester III
 * ---------------------------------------------------------------------------
 *
 * Sample Output
 * ---------------------------------------------------------------------------
 * 				  Jackson, John, J.
 * 				  Johnson, J., Johnson
 * 					 Smith, Betty, Smith
 * 				 Robinson, Charles, Robinson
 * 				 Robinson, Charles, Robinson
 * 					  West, Cindy, Ann
 * 					  West, Cindy, Ann
 * 					  West, Cindy, West
 * 			  Winchester, Charle, Emerson
 * ---------------------------------------------------------------------------
 *
 * - Author -
 * Douglas Lane, Sacramento Calfornia
 * programmer 6 years, C programmer 3 years.
 *
 */

#include <stdio.h>
#include <string.h>

#ifdef TURBOC
#include <stdlib.h> 
#endif

#define	MAXBUFNAME	100
#define	TESTFILE 	"test"

/* ----------------------------------------------------------------------- *
 * 			getname - get a single name
 *
 * returns index of next word in istr.
 * ----------------------------------------------------------------------- */

#ifdef ANSIC

  int getname(char *inname, char *thename, int startidx)

#else

  int getname(inname, thename, startidx)
  char *inname;
  char *thename;
  int startidx;

#endif

{
	int idx;
	int num;

	idx = 0;
	for (num=startidx; inname[num] != ' ' && inname[num] != '\0'; num++)
	{
		thename[idx] = inname[num];
		idx ++;
	}
	thename[idx] = '\0';

	while (inname[num] == ' ')
	  num++;

	return num;
}

/* ----------------------------------------------------------------------- *
 * 			not first name
 *
 * not a valid first name
 * ----------------------------------------------------------------------- */

#ifdef ANSIC

 int notfirstname(char *thename)

#else

  int notfirstname(thename)
  char *thename;

#endif

{
	return(
			  (strcmp(thename, "Mr.")==0) ||
			  (strcmp(thename, "Mrs.")==0) ||
			  (strcmp(thename, "Miss")==0) ||
			  (strcmp(thename, "Ms.")==0)
			);
}

/* ----------------------------------------------------------------------- *
 * 			not last name
 *
 * not a valid last name
 * ----------------------------------------------------------------------- */

#ifdef ANSIC

 int notlastname(char *thename)

#else

  int notlastname(thename)
  char *thename;

#endif
{
   return(
           (strcmp(thename, "Sr.")==0) ||
           (strcmp(thename, "Jr.")==0) ||
           (strcmp(thename, "III")==0)
         );
}

/* ----------------------------------------------------------------------- *
 * 			splitname 
 *
 * split name into first, middle, last
 * ----------------------------------------------------------------------- */


#ifdef ANSIC

 int splitname(char *fullname, char *first, char *middle, char *last)

#else

 int splitname(fullname, first, middle, last)
 char *fullname;
 char *first;
 char *middle;
 char *last;

#endif
{
	int	numnames;
	int	idx;

	numnames = 0;

	while (fullname[0]==' ')  /* this left justifies the string */
	  fullname++;

	/* -- first name -- */

	idx = getname(fullname, first, 0);

	if (notfirstname(first))
		idx = getname(fullname, first, idx);

	if (first[0]!='\0')
      numnames++;

	/* -- middle name -- */

	idx = getname(fullname, middle, idx);

	if (middle[0]!='\0')
		numnames++;

	/* -- last name -- */

	idx = getname(fullname, last, idx);

	if (last[0]!='\0')
		numnames++;

	/* -- remove middle name -- */

	if (notlastname(last) || (last[0]=='\0')) 
	{
		strcpy(last,middle);
		middle = '\0';
	}

	return numnames;

}


main()
{
	char buf[MAXBUFNAME];
	char first[MAXBUFNAME];
	char mid[MAXBUFNAME];
	char last[MAXBUFNAME];
	FILE *fp;

	int  namecount;

	fp = fopen(TESTFILE,"r");
	if (fp!=NULL)
	{
		while (fgets(buf,MAXBUFNAME,fp) !=NULL)
		{
			buf[strlen(buf)-1] = '\0';
			namecount = splitname(buf, first, mid, last);

			if (namecount == 2)
				printf(" %20s, %s \n",last,first);
			else
				printf(" %20s, %s, %s \n",last,first,mid);
		}
		fclose(fp);
		exit(0);
	}
	else
		fprintf(stderr," could not open %s \n",TESTFILE);

	return 1;
}



More information about the Comp.lang.c mailing list