OP's first problem is typically solved by prepending a space to the format. This will consume white-space including the previous line's '\n'
.
// scanf("%c", &character);
scanf(" %c", &character);
Moreover, the program does not work for strings with more than one word. How could I overcome these problems?
For the the 2nd issue, let us go for a more precise understanding of "string" and what "%s"
does.
A string is a contiguous sequence of characters terminated by and including the first null character. 7.1.1 1
OP is not entering a string even though "I enter a string (e.g.: computer)," is reported. OP is entering a line of text. 8 characters "computer" followed by Enter. There is no "null character" here. Instead 9 char
"computer\n"
.
"%s"
in scanf("%s", string);
does 3 things:
1) Scan, but not save any leading white-space.
2) Scan and save into string
any number of non-white-space.
3) Stop scanning when white-space or EOF reached. That char
is but back into stdin
. A '\0'
is appended to string
making that char
array a C string.
To read a line including spaces, do not use scanf("%s",...
. Consider fgets()
.
fgets(string, sizeof string, stdin);
// remove potential trailing \r\n as needed
string[strcspn(string, "\n")] = 0;
Mixing scanf()
and fgets()
is a problem as calls like scanf("%s", string); fgets(...)
leave the '\n'
in stdin
for fgets()
to read as a line consisting of only "\n"
. Recommend instead to read all user input using fgets()
(or getline()
on *nix system). Then parse the line read.
fgets(string, sizeof string, stdin);
scanf(string, "%c", &character);
If code must user scanf()
to read user input including spaces:
scanf("%*[\n]"); // read any number of \n and not save.
// Read up to 199 `char`, none of which are \n
if (scanf("%199[^\n]", string) != 1) Handle_EOF();
Lastly, code should employ error checking and input width limitations. Test the return values of all input functions.