Mega Code Archive
Storing and displaying proverbs in order of length
/*
Beginning C, Third Edition
By Ivor Horton
ISBN: 1-59059-253-0
Published: Apr 2004
Publisher: apress
*/
/********************
* This program will read any number of proverbs of any length. *
* The input buffer has a default size that is increased automatically *
* if it is not large enough. The current contents of the old buffer *
* are copied to the new and the old buffer is released before input *
* continues. *
* The same applies to the number of proverbs. If the initial capacity *
* for pointers to proverbs is exceeded, a larger space is allocated *
* and the existing pointers are copied to the new memory before releasing *
* the old memory. *
* You could add printf() statements to record when new memory is allocated*
* Values for BUFFER_LEN, BUFFER_LEN_INCR, and CAPACITY_INCR are set low *
* so as to cause frequent reallocation of memory for you to track. *
* In a practical program they would be set much higher to avoid *
* frequent allocation and release of memory. *
*********************/
#include
#include
#include
#define BUFFER_LEN 5 /* Initial length of input buffer */
#define BUFFER_LEN_INCR 2 /* Increment to buffer length */
#define CAPACITY_INCR 2 /* Increment to capacity for proverbs */
void main()
{
char **pProverbs = NULL; /* Pointer to string pointer */
char **temp = NULL; /* Temporary pointer to string pointer */
int capacity = 0; /* Number of proverbs that can be stored */
int count = 0; /* Number of proverbs read */
char *pbuffer = NULL; /* Pointer to buffer */
char *pstart = NULL; /* Pointer to buffer start */
char *pstr = NULL; /* Pointer to a string */
int buffer_length = BUFFER_LEN; /* Buffer length */
int i = 0; /* Loop counter */
int j = 0; /* Loop counter */
pbuffer = (char*)malloc(BUFFER_LEN); /* Initial buffer size */
pstart = pbuffer; /* Store start of buffer */
for(;;)
{
if(count==capacity)
{
capacity += CAPACITY_INCR;
temp = (char**)malloc(capacity*sizeof(char*));
if(temp == NULL) /* If memory was not allocated */
{ /* Output a message and end */
printf("Memory allocation failed. Terminating program.");
exit(1);
}
if(pProverbs == NULL) /* Are there any proverbs? */
pProverbs = temp; /* No - so just copy address of new memory */
else /* Yes - so copy data from old to new */
{
for(i = 0 ; istrlen(*(pProverbs+j)))
{
pstr = *(pProverbs+i);
*(pProverbs+i) = *(pProverbs+j);
*(pProverbs+j) = pstr;
}
/* Output all the strings */
printf("\nIn ascending length order, the proverbs you entered are:\n");
for (i = 0 ; i