scanf函数加空白符

scanf()中空白字符(包括/n,space)会使scanf()函数在读操作中略去输入中的零个或者一个或者多个空白字符,空白符可以是space,tab,换行 等等,直到第一个非空白符出现为止。
sacnf ("%d ", &a[i]);的%d后面有个空格时,在输入数字后,sacnf会跳过所有空格字符,包括回车符,直到遇到不是空格字符才退出
scanf加空白符之后的效果:

空白符 : 空格(space)、TAB、回车(\r)、换页(\f)、换行(\n)

while((c = getchar()) == ’ ’ || (c = getchar()) == ‘\t’ || (c = getchar()) == ‘\n’);//跳过空白符、注意while语句后面是分号

while((c = getchar()) == ’ ’ || (c = getchar()) == ‘\t’ || (c = getchar()) == ‘\n’)
{
NULL;
}

就是while语句内什么也不做,和上面的写法等同

#include <stdio.h>

int main(void)
{
int a = 0;

scanf("%d\n",&a);
printf("%d\n",a);

return 0;
}

scanf中加\n输入: (在这里\n可以是空白符的任意一个)
20
s //这里可以是任意一个字母
输出 20
结果要输入两个数程序才结束,而不是预期的一个。

\n并不是纯粹的换行符,
原因:空白符结尾时,scanf会跳过空白符去读下一个字符,所以你必须再输入一个数;
如果用scanf(“%d “,&a)也会出现同样问题

解决: 当 你从键盘输入数据时,是先放在该缓冲中,然后scanf才从该缓冲中读数据,你不加\n时,你输入i的值,然后回车想再输入m的值吧?这时送到缓冲中的就 是i的值和一个回车符,所以scanf第一次读的是i,第二次读的就是一个回车符,所以printf(“%c\n”,m);输出的是回车,而不是你理想中 的m值,所以要加\n读掉那个多余的回车符

总结:scanf(“%d “,&a);%d后可以是空白符的任意一种,加空白符的作用是:如果打回车后想再输入一个值,通过加空白符可以读掉多余的回车符

关于scanf:
当调用scanf函数时,系统先从键盘缓冲区查找有木有数据,如果键盘缓冲区有数据,则直接读键盘缓冲区的数据,不等待用户输入;当键盘缓冲区木有数据时,再等待用户输入。
输入结束标志: 非法输入、格式列控制、回车 结束本次输入
如果输入的数据或者从键盘缓冲区读入的数据与格式控制列表不一致时,就会发生错误,就不会读取该字符(数据),本次输入结束。

转载自:https://blog.csdn.net/hacker00011000/article/details/47987267

 

posted @ 2020-02-16 20:52  lilouv  阅读(791)  评论(0编辑  收藏  举报