【问题标题】:what is the purpose of putting a space in scanf like this scanf(" %c",&ch) in place of scanf("%c",&ch)? [duplicate]像这样scanf(“%c”,&ch)在scanf中放置一个空格代替scanf(“%c”,&ch)的目的是什么? [复制]
【发布时间】:2013-06-14 14:49:01
【问题描述】:

像这样在scanf中放一个空格的目的是什么

scanf(" %c",&ch) 

代替

scanf("%c",&ch)?

还有fflush(stdin) 中的输入缓冲区是什么?

【问题讨论】:

  • 在读取字符之前在此处放置一个空格将忽略任何类型的空格。
  • stdin,你的程序的输入流.....你通过控制台输入的任何东西都会被放在那个缓冲区中
  • fflush() 用于刷新 output 缓冲区,因此在输入流上调用它是没有意义的(通常是由于误解它会丢弃任何已经缓冲的输入)。
  • 嗯,这在文档中有解释。不用问了。
  • @barmar,即使它确实很糟糕。将文件重定向为输入。您可能认为您正在刷新最后输入的行,但实际上您忽略了该重定向提供的整个输入。刷新输入毫无意义。如果您不想阅读输入,请不要!

标签: c


【解决方案1】:

因为%c 之前的空格会忽略所有空格。 *scanf 系列函数默认忽略任何 % 之前的所有空格,%c%[%n 除外。这在 C11 中提到:

7.21.6.2.8

跳过输入的空白​​字符(由 isspace 函数指定),除非 规范包括 [、c 或 n 说明符。

为了完整起见,以下是所有空格都将被忽略的部分:

7.21.6.2.5

由空白字符组成的指令通过读取输入执行到 第一个非空白字符(未读),或者直到没有更多字符可以 被阅读。该指令永远不会失败。


关于您的第二个问题,fflush(stdin) 会导致未定义的行为,不得使用(强调我的):

7.21.5.2.2

如果流指向输出流或更新流,其中最近的 未输入操作,fflush 函数会导致该流的任何未写入数据 被交付到宿主环境中写入文件; 否则,行为未定义

【讨论】:

  • 谢谢大家,但即使我刷新输入流,它会刷新整个输入流还是只刷新空格或换行符?另外,当我意识到我必须删除输入字符流中的空格或者我必须在每次读取字符时明确地这样做时?
  • @RahulKathuria,你永远不会刷新输入流。如果您的操作系统因此格式化了您的硬盘,那完全是您的错。如果它试图变得更好,它会简单地丢弃你所有的输入,所以你没有什么可读的了。所以,不要刷新输入流,好吗?
  • 其次,*scanf 会为您跳过空格,因此别无选择。你唯一可以选择的地方是%c(我怀疑你会使用%[)。在那里,如果您有兴趣阅读空白,请在其前面放置一个空格 (" %c")。如果您对空格不感兴趣,请不要在其前面添加空格 ("%c")。就这么简单。其余的将由scanf 管理。
【解决方案2】:

像这样scanf("%c",&ch)在scanf中放置一个空格来代替scanf("%c",&ch)的目的是什么?

这样scanf 会在流中遇到第一个非空格字符之前忽略所有空格。

还有什么是 fflush(stdin) 中的输入缓冲区?

您输入到控制台的内容将存在于stdin 流中。

但不要刷新该流,这是未定义的行为。 如果你想丢弃在调用scanf之后输入的字符,你可以读取并丢弃它们。

【讨论】:

  • 谢谢大家,但即使我刷新输入流,它会刷新整个输入流还是只刷新空格或换行符?另外,当我意识到我必须删除输入字符流中的空格或者我必须在每次读取字符时明确地这样做时?
【解决方案3】:

在这种情况下,scanf 中的空格告诉 scanf 忽略您读取的字符前面的任何前导空白字符。即使字符前面没有空格,代码仍然可以正常工作并成功读取字符。

我不确定您在上一个问题中要问什么,但 stdin 是您程序的标准输入流。

【讨论】:

  • 谢谢大家,但即使我刷新输入流,它会刷新整个输入流还是只刷新空格或换行符?另外,当我意识到我必须删除输入字符流中的空格或者我必须在每次读取字符时明确地这样做时?
【解决方案4】:
scanf(" %c",&ch);

根据man page

空白(如空格、 格式字符串中的制表符或换行符)匹配任意数量的空白, 不包括,在输入中。

Stdin 是标准输入。用户为程序输入数据,这些数据首先存储在缓冲区中,然后当程序通过读取操作请求数据传输时,数据可供程序使用。 (使用scanf 等)。

【讨论】:

  • 谢谢大家,但即使我刷新输入流,它会刷新整个输入流还是只刷新空格或换行符?另外,当我意识到我必须删除输入字符流中的空格或者我必须在每次读取字符时明确地这样做时?
  • @RahulKathuria fflush 将刷新所有字符。 However it is not correct to use with with stdin.
【解决方案5】:

前段时间我遇到了同样的问题,如果我尝试使用scanf ("%c", &ans); 读取变量,它不会读取任何内容。因此,我发现正在读取最后一个输入中的 \n 字符。

因此,scanf (" %c", &ans); 解决了我的问题。

虽然,我不能清楚地理解你的第二个问题。

【讨论】:

    【解决方案6】:

    只是为了给最后一个对象一个空格,如果没有,例如一个字符串,所有的东西都将放在一起,它们之间没有空格。

    【讨论】:

    • 我认为您需要重新阅读该问题,您的答案不正确且没有意义。 OP 说的是scanf,而不是printf
    • 谢谢大家,但即使我刷新输入流,它会刷新整个输入流还是只刷新空格或换行符?另外,当我意识到我必须删除输入字符流中的空格或者我必须在每次读取字符时明确地这样做时?
    猜你喜欢
    • 2017-02-17
    • 1970-01-01
    • 2021-12-18
    • 2021-11-29
    相关资源
    最近更新 更多