将scanf中的空格(“%c”,&ch)替换为scanf(“%c”,&ch)的目的是什么?
像这样在scanf
中放置空格的目的是什么
scanf(" %c",&ch)
代替
scanf("%c",&ch)?
fflush(stdin)
输入缓冲区是什么?
因为%c
之前的空格忽略了所有空格。 *scanf
系列函数在默认情况下忽略所有空格,除了%c
, %[
和%n
。 这在C11中提到:
7.21.6.2.8
除非规范包含[,c或n说明符,否则将跳过输入的空白字符(由isspace函数指定)。
要完成,这里的部分表示将忽略所有空格:
7.21.6.2.5
由白色空格字符组成的指令通过读取第一个非空白字符(仍然未读取)的输入来执行,或者直到不再能够读取字符为止。 该指令永远不会失败。
关于你的第二个问题, fflush(stdin)
导致未定义的行为,不得使用(强调我的):
7.21.5.2.2
如果流指向输入流或未输入最近操作的更新流 ,则fflush函数会将该流的任何未写入数据传送到主机环境以写入该文件; 否则,行为未定义 。
将scanf中的空格(“%c”,&ch)替换为scanf(“%c”,&ch)的目的是什么?
因此, scanf
会在流中遇到第一个非空格字符之前忽略所有空格。
fflush(stdin)中的输入缓冲区是什么?
您输入控制台的内容将存在于stdin
流中。
但是,不要刷新该流,这是未定义的行为 。 如果要放弃在调用scanf
后输入的字符,可以阅读并丢弃它们。
在这种情况下,scanf中的空格告诉scanf忽略您读取的字符前面的任何前导空格字符。 即使角色前面没有空格,代码也能正常工作并成功读取角色。
我不确定你在上一个问题中提到了什么,但是stdin是你程序的标准输入流。
scanf(" %c",&ch);
根据手册页 ,
格式字符串中的空格(如空格,制表符或换行符)在输入中匹配任意数量的空格, 包括无空格。
Stdin是标准输入。用户输入程序的数据,首先将其存储在缓冲区中,然后当程序通过使用读取操作请求数据传输时,数据可供程序使用。 (使用scanf
等)。
我前一段时间遇到同样的问题,如果我尝试使用scanf ("%c", &ans);
读取变量scanf ("%c", &ans);
它不会读任何东西。 因此我发现正在读取最后一个输入的\n
字符。
因此,做scanf (" %c", &ans);
解决了我的问题。
虽然,我无法清楚地理解你的第二个问题。
只是为了给最后一个对象提供一个空格,如果不是,例如一个字符串,一切都将在它们之间没有空格。