【问题标题】:How format specifiers works with scanf in loop in C?格式说明符如何在 C 中的循环中与 scanf 一起使用?
【发布时间】:2021-04-26 14:34:38
【问题描述】:

这段代码可以正常工作:

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) 时,不需要第二次输入。为什么?

【问题讨论】:

  • 它“正常工作”,直到您输入一个在第一个换行符前超过 49 个字符的字符串。
  • 手册里都有说明。
  • %[^\n] 使用除换行符以外的任何内容。 %*c 使用换行符。如果省略%*c,则永远不会消耗换行符,随后对 scanf 的调用将返回而不消耗任何内容。在每种情况下,scanf 返回 0。您应该始终检查 scanf 返回的值。
  • scanf("%[^\n]", str) 工作得很好(除了它是不好的做法并且容易导致未定义的行为)。它只是没有做你期望它做的事情。
  • scanf("%[^\n]", str) 不适用于两个输入。它只读取一个输入。但在代码中我想读取两个输入。

标签: c scanf format-specifiers


【解决方案1】:

scanf 中,%*c 表示输入一个字符,但实际上并不将其存储在任何内容中。所以试着想象一下。在循环的第一次运行中,当您输入 behzad namdaryan 时,stdin 将如下所示:

behzad namdaryan\n

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

\n

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

【讨论】:

  • 非常有用的解释。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 2012-10-01
    • 2021-10-29
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多