Средства для создания приложений в ОС UNIX (Указания к лабораторной работе № 5), страница 4

Приведенный ниже текст программы abcd.c  содержит  целый ряд ошибок,  как синтаксических, так и семантических. Предполагается, что при выполнении лабораторной работы студенты должны отыскать и исправить эти ошибки  и тем самым приобрести  практические навыки по использованию таких инструментальных средств как CVS, gdb, gcc, make.

В  качестве  тестового  примера  при  выполнении лабораторной работы будем использовать строку:

this is a test the abcd program

При запуске отлаженной  программы  abcd  без параметров после ввода этой строки на экране должно быть:

this

is

a

test

the

abcd

program

При запуске отлаженной программы abcd с параметром -t после ввода этой строки на экране должно быть:     this

                                                             test

                                                             the

 Исходный текст программы abcd.c

для лаботаторной работы N5

#include <stdio.h>

#include <ctype.h>          /*  */

#include <string.h>

/* Manifests for state machine to parse input line. */

#define WORD       0

#define IGNORE   1

/* Globals, used by both subroutines. */

char     *Words[BUFSIZ/2];                  /* Worst case, single letters. */

int      WordCount;

/* Walk through the array of works, find those with the

 * matching charakter, printing them on stdout. Note that

 * the NULL charakter will match all words. */

void PrintWords(wc, match)

int wc;                               /* Number of words in Words[] */

char match;                      /* Attempt to match this charakter. */

{  register int    ix;            /* Index in Words[]. */

   register char   *cp;        /* Pointer for searching. */

   for (ix=0; ix < wc; ix++) {

              cp = Words[ix];

              /* Try to match the given character.

               * Scan the word, attempting to match,

               * or until the end of the word is found. */

              while ((*cp) && (*cp++ != match));

              if (*cp == match)  /* Found a match? Write the word on stdout. */

                      (void) printf("%s0, Words[ix]); } return; }

/* Find words in the gives buffer. The Words[] array is set

 * to point at words in the buffer, and the buffer modifeid

 * with NULL characters to delimit the words. */

int GetWords (buf)

char     buf[];                      /* The input buffer. */

{        register char    *cp;       /* Pointer for scanning. */

         int      end = strlen(buf); /* length of the buffer. */ 

         register int  wc = 0;       /* Number of words found. */

         int      state = IGNORE;    /* Current state. */

         /* For each character in the buffer. */

         for (cp = &buf[0]; cp < &buf[end]; cp++) {

             /* A simple state machine to process

              * the current character in the buffer. */

             switch(state) {

             case IGNORE:

                  if (!isspace(*cp)) {

                      Words[wc++] = cp;  /* Just started a word? Save it. */

                      state = WORD;      /* Reset the state. */ } break;

             case WORD:

                  if (isspace(*cp)) {

                      *cp = '\0';        /* Just completed aword? terminate it. */

                      state = IGNORE;    /* Reset the state. */ } break; }}

          return wc; /* Return the word count. */ }

int  main(argc, argv)  int argc; char *argv[]; { char buf[BUFSIZ], match;

/* Check command line arguments. */

if (argc < 2) match = ' ';