问题
I am not able to understand the difference. I use %[^\n]s
, for taking phrases input from the user. But this was not working when I needed to add two phrases. But the above one did. Please help me understanding me the difference.
回答1:
The %[\n]
directive tells scanf()
to match newline characters, and the *
flag signals that no assignment should be made, so %*[\n]
skips over any leading newline characters (assuming there is at least one leading \n
character: more on this in a moment). There is a space following this first directive, so zero or more whitespace characters are skipped before the final %[^\n]
directive, which matches characters until a newline is encountered. These are stored in input_string[]
, and the newline character is left behind in the input stream. Subsequent calls using this format string will skip over this remaining newline character.
But, there is probably no need for the %*[\n]
directive here, since \n
is a whitespace character; almost the same thing could be accomplished with a leading space in the format string: " %[^\n]"
.
One difference between the two: "%*[\n] %[^\n]"
expects there to be a newline at the beginning of the input, and without this the match fails and scanf()
returns without making any assignments, while " %[^\n]"
does not expect a leading newline, or even a leading whitespace character (but skips them if present).
If you used "%[^\n]"
instead, as suggested in the body of the question (note that the trailing s
is not a part of the scanset directive), the first call to scanf()
would match characters until a newline is encountered. The matching characters would be stored in input_string[]
, and the newline would remain in the input stream. Then, if scanf()
is called again with this format string, no characters would be matched before encountering the newline, so the match would fail without assignment.
Please note that you should always specify a maximum width when using %s
or %[]
in a scanf()
format string to avoid buffer overflow. With either of %s
or %[]
, scanf()
automatically adds the \0
terminator, so you must be sure to allow room for this. For an array of size 100, the maximum width should be 99, so that at most 99 characters are matched and stored in the array before the null terminator is added. For example: " %99[^\n]"
.
回答2:
In scanf function, '*' tells the function to ignore a character from input.
%*[\n]
This tells the function to ignore the first '\n' character and then accept any string
Run the code and first give "ENTER" as input and then give "I am feeling great!!!" Now print the buffer. You will get I am feeling great!!! as output
Try this code snippet
int main()
{
char buffer[100];
printf("Enter a string:"),scanf("%*[\n] %[^\n]', buffer),printf("buffer:%s\n", buffer);
return 0;
}
来源:https://stackoverflow.com/questions/45278383/what-does-scanf-n-n-input-string-do