Like this perhaps.
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *changeString(char *str, size_t size);
int main()
{
char *string;
string = malloc(5 * sizeof(*string));
string = changeString(string, 5);
printf("\nNew string is >>%s<<\n", string);
free(string);
// you can even start with no initial allocation
string = changeString(NULL,0);
printf("\nNew string is >>%s<<\n", string);
free(string);
return 0;
}
char *changeString(char *str, size_t size)
{
size_t pos = 0;
do {
if ((pos+1) >= size) { // allow for the \0
size_t new_size = size + 10;
void *t = realloc(str, new_size * sizeof(*str));
if (t) {
str = t;
size = new_size;
} else {
// realloc failed, return what we have
return str;
}
}
if ( scanf("%c", &str[pos]) == EOF ) {
str[pos] = '\0';
return str; // user got bored
}
pos++;
// always keep the result a valid \0 terminated string
str[pos] = '\0';
} while (str[pos - 1] != '\n');
return str;
}