格式说明符如何在 C 中循环使用 scanf?

How format specifiers works with scanf in loop in C?

这段代码可以正常工作:

int main()
{
    int i,n=2;
    char str[50];

    for (i = 0; i < n; i++)
    {
        puts("Enter a name");
        scanf("%[^\n]%*c", str);
        printf("%s\n", str);
    }

return 0;
}

并读取和写入两个输入。

问题:

  1. 什么是%[^\n]%*c?特别是 %*c?它是如何工作的?
  2. 当我将该行更改为 scanf("%[^\n]", str) 时,不需要第二个 input.why?

scanf中,%*c表示取一个输入字符,但不实际存储在任何东西中。所以试着想象一下。在循环的第一个 运行 中,当您输入 behzad namdaryan 时,stdin 将看起来像这样:

behzad namdaryan\n

现在,%[^\n] 将输入视为字符串,直到达到 \n。它会 NOT 在输入中计数 \n,它会把它留在那里。因此,如果这是循环中的 scanf("%[^\n]", str);,则在第一个 运行 之后,stdin 将如下所示:

\n

如您所见,\n 仍然存在。现在每次它再次执行 scanf 时,它会立即找到 \n 并将其留在那里并且实际上不会提示您输入(因为 stdin 不是空的)。 %*c 会处理这个问题。每次将字符串作为输入后,%*c 会删除并处理流中的最后一个 \n,这样流就变空了,您可以再次输入。

scanf 格式字符串中,%[^\n] 表示匹配除换行符以外的所有字符。 %*c 表示匹配字符但不将其分配给输入。

由于 %[^\n] 将匹配所有字符直到找到换行符,因此 %*c 将使用该换行符而不存储它。 %[^\n] 匹配的字符将存储在str.