#include #include #include 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; }