While the above mentioned methods do work, but each one has it's own kind of problems.
You can use getline()
or getdelim()
, if you are using posix supported platform.
If you are using windows and minigw as your compiler, then it should be available.
getline()
is defined as :
ssize_t getline(char **lineptr, size_t *n, FILE *stream);
In order to take input, first you need to create a pointer to char type.
#include <stdio.h>
#include<stdlib.h>
// s is a pointer to char type.
char *s;
// size is of size_t type, this number varies based on your guess of
// how long the input is, even if the number is small, it isn't going
// to be a problem
size_t size = 10;
int main(){
// allocate s with the necessary memory needed, +1 is added
// as its input also contains, /n character at the end.
s = (char *)malloc(size+1);
getline(&s,&size,stdin);
printf("%s",s);
return 0;
}
Sample Input:Hello world to the world!
Output:Hello world to the world!\n
One thing to notice here is, even though allocated memory for s is 11 bytes,
where as input size is 26 bytes, getline reallocates s
using realloc()
.
So it doesn't matter how long your input is.
size
is updated with no.of bytes read, as per above sample input size
will be 27
.
getline()
also considers \n
as input.So your 's' will hold '\n' at the end.
There is also more generic version of getline()
, which is getdelim()
, which takes one more extra argument, that is delimiter
.
getdelim()
is defined as:
ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream);
Linux man page