Приведенный ниже текст программы 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 = ' ';
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.