格式说明符如何在 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;
}
并读取和写入两个输入。
问题:
- 什么是
%[^\n]%*c
?特别是 %*c
?它是如何工作的?
- 当我将该行更改为
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
.
这段代码可以正常工作:
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;
}
并读取和写入两个输入。
问题:
- 什么是
%[^\n]%*c
?特别是%*c
?它是如何工作的? - 当我将该行更改为
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
.