6

what is the purpose of putting a space in scanf like this

scanf(" %c",&ch) 

in place of

scanf("%c",&ch)?

Also what is input buffer in fflush(stdin)?

4

6 回答 6

4

因为之前的%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

如果 stream 指向未输入最近操作的输出流或更新流,则 fflush 函数会导致该流的任何未写入数据被传递到主机环境以写入文件;否则,行为是 undefined

于 2013-06-14T14:56:08.167 回答
3

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

因此,这scanf将在流中遇到第一个非空格字符之前忽略所有空格。

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

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

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

于 2013-06-14T14:51:21.570 回答
2

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

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

于 2013-06-14T14:51:55.277 回答
2
scanf(" %c",&ch);

根据手册页

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

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

于 2013-06-14T15:01:27.397 回答
0

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

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

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

于 2016-01-03T10:50:38.867 回答
-1

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

于 2013-06-14T14:51:47.323 回答