什么是scanf("%* [\ n]%[^ \ n]",input_string);做?

时间:2017-07-24 10:37:52

标签: c string scanf

我无法理解其中的差别。我使用%[^\n]s来获取用户输入的短语。但是当我需要添加两个短语时,这不起作用。但上面的确如此。请帮我理解差异。

3 个答案:

答案 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() 甚至可以读取带有空格的字符串。

当遇到换行符时,它将终止接收用户输入的字符串。