我无法理解其中的区别。我使用 %[^\n]s
来获取用户输入的短语。但是当我需要添加两个短语时,这不起作用。但是上面那个做到了。请帮助我了解其中的区别。
最佳答案
%[\n]
指令告诉scanf()
匹配换行符,*
标志表示不应进行分配,因此 %*[\n]
跳过任何前导换行符(假设 至少有一个前导 \n
字符:稍后会详细介绍)。在第一个指令之后有一个空格,因此在最后一个 %[^\n]
之前会跳过零个或多个空白字符。指令,匹配字符直到遇到换行符。这些存储在 input_string[]
中, 换行符留在输入流中。使用此格式字符串的后续调用将跳过剩余的换行符。
但是,可能不需要 %*[\n]
指令在这里,因为 \n
是一个空白字符;使用格式字符串中的前导空格几乎可以完成相同的事情:" %[^\n]"
.
两者的区别之一:"%*[\n] %[^\n]"
期望在输入的开头有一个换行符,如果没有这个匹配失败并且scanf()
返回时不做任何赋值,而 " %[^\n]"
不期望前导换行符,甚至是前导空白字符(但如果存在则跳过它们)。
如果您使用了 "%[^\n]"
相反,正如问题正文中所建议的那样(请注意尾随的 s
不是 scanset 指令的一部分),第一次调用 scanf()
将匹配字符,直到遇到换行符。匹配的字符将存储在 input_string[]
中,换行符将保留在输入流中。然后,如果scanf()
使用此格式字符串再次调用,在遇到换行符之前不会匹配任何字符,因此如果没有赋值,匹配将失败。
请注意,使用 %s
时应始终指定最大宽度或 %[]
在scanf()
格式化字符串以避免缓冲区溢出。使用 %s
中的任何一个或 %[]
, scanf()
自动添加 \0
终结器,因此您必须确保为此留出空间。对于大小为 100 的数组,最大宽度应为 99,以便在添加空终止符之前最多匹配并存储 99 个字符到数组中。例如:" %99[^\n]"
.
关于c - 什么是 scanf ("%*[\n] %[^\n]", input_string);做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45278383/