1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
/*
** GETSTRNG.C -- Demonstation of dynamic memory allocation to
** receive string of unknown length.
**
** Ron Sires 1/31/89, released to the public domain.
** Bob Stout 2/18/93, modified to use a static buffer
*/
#include <stdlib.h>
#include <stdio.h>
#define BLOCKSIZ 16
char *getstring(void)
{
int newchar;
size_t i;
static size_t bufsize = 0;
static char *buffer = NULL;
/* Get chars from keyboard and put them in buffer. */
for (i = 0; ((newchar = getchar()) != EOF) && (newchar != '\n')
&& (newchar != '\r'); ++i )
{
if (i + 1 > bufsize)
{
/* If buffer is full, resize it. */
if (NULL == (buffer = realloc(buffer, bufsize + BLOCKSIZ)))
{
puts("\agetstrng() - Insufficient memory");
/* Add terminator to partial string */
if (buffer)
buffer[i] = '\0';
return buffer;
}
bufsize += BLOCKSIZ;
}
buffer[i] = (char) newchar;
}
buffer[i] = '\0'; /* Tack on a null-terminator. */
return buffer;
}
#ifdef TEST
#include <string.h>
int main(void)
{
char *string;
puts("Enter strings of any length or <Enter> to quit\n");
do
{
string = getstring();
printf("You entered:\n\"%s\"\n\n", string);
} while (strlen(string));
free(string);
return EXIT_SUCCESS;
}
#endif /* TEST */
|