|
|
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
-
-
- char *getLine(void);
- char *trim(char *phrase);
-
-
- char *getLine(void) {
-
- const size_t sizeIncrement = 10;
- char *buffer = malloc(sizeIncrement);
- char *currentPosition = buffer;
- size_t maximumLength = sizeIncrement;
- size_t length = 0;
- int character;
-
- if (currentPosition == NULL) {
- return NULL;
- }
-
- while (1) {
- character =fgetc(stdin);
- if (character == '\n') {
- break;
- }
- if (++length >= maximumLength) {
- char *newBuffer = (char*) realloc(buffer, maximumLength += sizeIncrement);
- if (newBuffer == NULL) {
- free(buffer);
- return NULL;
- }
- currentPosition = newBuffer + (currentPosition - buffer);
- buffer = newBuffer;
- }
- *currentPosition++ = character;
- }
- *currentPosition = '\0';
- return buffer;
- }
-
-
- char *trim(char *phrase) {
-
- char *old = phrase;
- char *new = phrase;
-
- // skip blank chars
- while (*old == ' ') {
- old++;
- }
-
- while (*old) {
- *new = *old;
- new++;
- old++;
- }
-
- // set string end char
- *new = 0;
-
- return (char*) realloc(phrase, strlen(phrase) + 1);
- }
-
-
- int main(void) {
-
- // this is wrong -> realloc in trim() on array which wasn't malloc'ed
- // char blub[] = " wurstgesicht";
- // printf("%s\n", trim(blub));
-
- // by using return value of getline(), we got an array which was malloc'ed
- char *buffer = trim(getLine());
-
- if (buffer == NULL) {
- printf("%s\n", "out of memory");
- } else {
- printf("%s\n", buffer);
- free(buffer);
- }
-
- return 0;
-
- }
|