我无法理解其中的差别。我使用%[^\n]s
来获取用户输入的短语。但是当我需要添加两个短语时,这不起作用。但上面的确如此。请帮我理解差异。
答案 0 :(得分:6)
%[\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]"
。
答案 1 :(得分:0)
在scanf功能中,' *'告诉函数忽略输入中的字符。
%*[\n]
这告诉函数忽略第一个' \ n'字符然后接受任何字符串
运行代码并首先提供" ENTER"作为输入,然后给予"我感觉很棒!!!" 现在打印缓冲区。你会觉得我很棒!作为输出
试试此代码段
int main()
{
char buffer[100];
printf("Enter a string:"),scanf("%*[\n] %[^\n]', buffer),printf("buffer:%s\n", buffer);
return 0;
}
答案 2 :(得分:0)
%[^\n]
是 scanf()
的编辑转换代码,替代 gets(str)
。
与 gets(str)
不同,带有 %s 的 scanf()
不能读取多个单词。
使用 %[^\n]
,scanf()
甚至可以读取带有空格的字符串。
当遇到换行符时,它将终止接收用户输入的字符串。