|
|
Program development begins with the creation of code from specifications. Sometimes, the code has already been written and must only be tested and debugged. This tutorial includes a sample program.
The sample program, testcase.c, was written to these specifications:
The file testcase.c contains the following code:
1 #include <stdio.h> 2 #include <ctype.h> 3 #include <string.h> 4 5 /* Manifests for state machine to parse input line. */ 6 #define WORD 0 7 #define IGNORE 1 8 9 #define BUFFERSIZE 5000 10 11 /* Globals, used by both subroutines. */ 12 char *Words[BUFSIZ/2]; /* Worst case, single letters. */ 13 int WordCount; 14 15 /* Walk through the array of words, find those with the 16 * matching character, printing them on stdout. Note that 17 * the null character will match all words. */ 18 void PrintWords(wc, match) 19 int wc; /* Number of words in Words[] */ 20 char match; /* Attempt to match this character. */ 21 { register int ix; /* Index in Words[]. */ 22 register char *cp; /* Pointer for searching. */ 23 for(ix = 0; ix < wc; ix++) { 24 cp = Words[ix]; 25 /* Try to match the given character. 26 * Scan the word, attempting to match, 27 * or until the end of the word is found. */ 28 while((*cp) && (*cp++ != match)); 29 if (*cp == match) /* Found a match? Write the word on stdout. */ 30 (void) printf("%s\n", Words[ix]); } return; } 31 32 /* Find words in the given buffer. The Words[] array is set 33 * to point at words in the buffer, and the buffer modified 34 * with NULL characters to delimit the words. */ 35 int GetWords(buf) 36 char buf[]; /* The input buffer. */ 37 { register char *cp; /* Pointer for scanning. */ 38 int end = strlen(buf); /* Length of the buffer. */ 39 register int wc = 0; /* Number of words found. */ 40 int state = IGNORE; /* Current state. */ 41 /* For each character in the buffer. */ 42 for(cp = &buf[0]; cp < &buf[end]; cp++) { 43 /* A simple state machine to process 44 * the current character in the buffer. 45 */ 46 switch(state) { 47 case IGNORE: 48 if (!isspace(*cp)) { 49 Words[wc++] = cp; /* Just started a word? 50 Save it. */ 51 state = WORD; /* Reset the state. */ } break; 52 case WORD: 53 if (isspace(*cp)) { 54 *cp = '\0'; /* Just completed a word? 55 terminate it. */ 56 state = IGNORE; /* Reset the state. */ } break; } } 57 return wc; /* Return the word count. */ } 58 59 int main(argc, argv) int argc; char *argv[]; { char buf[BUFSIZ], match; 60 /* Check command line arguments. */ 61 if (argc < 2) match = ' '; 62 /* No command line argument, match all words. */ 63 else match = *++argv[1]; /* Match the char after the first - */ 64 /* Until no more input on stdin. */ 65 while(gets(buf) != (char *)NULL) { 66 WordCount = GetWords(buf); /* Parse the input buffer. */ 67 PrintWords(WordCount, match); /* Print the matching words. */ } 68 return(0); /* Return success to the shell. */ }