126 lines
3.8 KiB
C
126 lines
3.8 KiB
C
/*****
|
||
* WORDCNT.C - Sample program for the debugging tutorial
|
||
*
|
||
* Copyright (c) 1988 Borland International. All rights reserved.
|
||
*
|
||
* NOTE: This program is for use with the debugging tutorial
|
||
* in the debugging chapter of the User's Guide. It
|
||
* intentionally contains bugs.
|
||
******/
|
||
|
||
#include <stdio.h>
|
||
#include <ctype.h>
|
||
|
||
#define MAXWORDLEN 16
|
||
#define NUL ((char)0)
|
||
#define SPACE ((char)0x20)
|
||
|
||
/*****
|
||
* Find the next word in the line buffer.
|
||
* IN: wordptr points to the first character of a word or a preceding
|
||
* space.
|
||
* RETURN: A pointer to the first character of the word. If there are no
|
||
* more words, a pointer to the terminating NUL.
|
||
*****/
|
||
char *nextword(char *wordptr)
|
||
{
|
||
/* Advance to the first non-space. */
|
||
while ( *wordptr==SPACE )
|
||
wordptr++;
|
||
return(wordptr);
|
||
}
|
||
|
||
|
||
/*****
|
||
* Find the length of a word. A word is defined as a sequence of characters
|
||
* terminated by a space or a NUL.
|
||
* IN: wordptr points to a word.
|
||
* RETURN:The length of the word.
|
||
*****/
|
||
int wordlen(char *wordptr)
|
||
{
|
||
char *wordlimit;
|
||
wordlimit = wordptr;
|
||
while ( *wordlimit & *wordlimit!=SPACE )
|
||
wordlimit++;
|
||
return( wordlimit-wordptr );
|
||
}
|
||
|
||
|
||
/*****
|
||
* The main function.
|
||
*****/
|
||
void main(void)
|
||
{
|
||
FILE *infile; /* Input file. */
|
||
char linebfr[1024], /* Input line buffer, very long for safety. */
|
||
*wordptr; /* Pointer to next word in linebfr. */
|
||
int i; /* Scratch variable. */
|
||
static int wordlencnt[MAXWORDLEN],
|
||
/* Word lengths are counted in elements 1 to
|
||
MAXWORDLEN. Element 0 isn't used. The array is
|
||
static so that the elements need not be set to
|
||
zero at run time. */
|
||
overlencnt; /* Overlength words are counted here. */
|
||
|
||
printf("WARNING: This is an example program for the practice\n");
|
||
printf("debugging session. If you are not running this under the\n");
|
||
printf("Integrated Development Environment press control-break now.\n");
|
||
printf("See the debugging chapter of the User's Guide for details.\n\n");
|
||
|
||
printf( "Enter the input file's name: " );
|
||
gets(linebfr);
|
||
if ( !strlen(linebfr) ) {
|
||
printf( "You must specify an input file name!\n" );
|
||
exit();
|
||
}
|
||
|
||
infile = fopen( linebfr, "r" );
|
||
if ( !infile ) {
|
||
printf( "Can't open input file!\n" );
|
||
exit();
|
||
}
|
||
|
||
/* Each loop processes one line. NOTE: if a line is longer than the
|
||
input buffer the program may produce invalid results. The very large
|
||
buffer makes this unlikely. */
|
||
while ( fgets( linebfr, sizeof(linebfr), infile ) ) {
|
||
printf("%s\n",linebfr);
|
||
/* Check for buffer overflow & remove the trailing newline. */
|
||
i = strlen(linebfr);
|
||
if ( linebfr[i-1] != '\n' )
|
||
printf( "Overlength line beginning\n\t%70s\n", linebfr );
|
||
else
|
||
linebfr[i-1] = NUL;
|
||
|
||
/* lineptr points to the 1st word in linebfr (past leading spaces). */
|
||
wordptr = nextword(linebfr);
|
||
|
||
/* Each loop processes one word. The loop ends when [nextword]
|
||
returns NULL, indicating there are no more words. */
|
||
while (*wordptr) {
|
||
/* Find the length of this word, increment the proper element of the
|
||
length count array, & point to the space following the word. */
|
||
i = wordlen(wordptr);
|
||
if ( i > MAXWORDLEN )
|
||
overlencnt++;
|
||
else
|
||
;
|
||
wordlencnt[i]++;
|
||
wordptr += i;
|
||
|
||
/* Find the next word (if any). */
|
||
wordptr = nextword(wordptr);
|
||
}
|
||
}
|
||
|
||
/* Print the word length counts. Each loop prints one. */
|
||
printf( " Length Count\n" );
|
||
for ( i=1; i<MAXWORDLEN; i++ )
|
||
printf( " %5d %5d\n", i, wordlencnt[i] );
|
||
printf( "Greater %5d\n", overlencnt );
|
||
|
||
/* Close the file & quit. */
|
||
fclose(infile);
|
||
}
|
||
|