
c语言中用“空格符”来处理缓冲区是个什么原理
#include<stdio.h>intmain(){inti;charj;for(i=0;i<10;i++){scanf("%c",&j);/*这里%前没有空格*/}}...
#include <stdio.h>int main()
{
int i;
char j;
for(i = 0;i < 10;i++)
{
scanf("%c",&j);/*这里%前没有空格*/
}
}
使用了空格控制符后:
#include <stdio.h>
int main()
{
int i;
char j;
for(i = 0;i < 10;i++)
{
scanf(" %c",&j);/*注意这里%前有个空格*/
}
}
这里用“空格符”来处理缓冲区是个什么原理
请说的详细一点
为什么缓冲区里的\n可以抵消掉%c前面的空格???? 展开
{
int i;
char j;
for(i = 0;i < 10;i++)
{
scanf("%c",&j);/*这里%前没有空格*/
}
}
使用了空格控制符后:
#include <stdio.h>
int main()
{
int i;
char j;
for(i = 0;i < 10;i++)
{
scanf(" %c",&j);/*注意这里%前有个空格*/
}
}
这里用“空格符”来处理缓冲区是个什么原理
请说的详细一点
为什么缓冲区里的\n可以抵消掉%c前面的空格???? 展开
2个回答
展开全部
这个是有关scanf的老生常谈了。
① 这个原理是基于标准C里面的whitespace的定义,空格、回车或换行符,制表符等被视为whitespace,而scanf中的格式“ %c”,已说明是按空格+字符来处理输入的。没有空格则格式中的空格被忽略, 如果有空格或回车换行,被当作空格对待。
② 这是技巧的出现,的确是因scanf的设计问题而应运而生的。scanf用的不好容易溢出; 一般认为应该避免使用它,用替代的方式如:while ((c = getchar()) != EOF && c != '\n');
③ 对“输入流”作fflush()不是标准的C方式, 意味着不同的编译器可能会有不同的结果,所以绝对应该避免。
① 这个原理是基于标准C里面的whitespace的定义,空格、回车或换行符,制表符等被视为whitespace,而scanf中的格式“ %c”,已说明是按空格+字符来处理输入的。没有空格则格式中的空格被忽略, 如果有空格或回车换行,被当作空格对待。
② 这是技巧的出现,的确是因scanf的设计问题而应运而生的。scanf用的不好容易溢出; 一般认为应该避免使用它,用替代的方式如:while ((c = getchar()) != EOF && c != '\n');
③ 对“输入流”作fflush()不是标准的C方式, 意味着不同的编译器可能会有不同的结果,所以绝对应该避免。
展开全部
scanf()这个函数,当其控制符中有诸如逗号,间隔(广义的,回车、tab等)时,输入时就要打入这个符号,不然就会对错位而错乱。有了那个空格,它就要等待输入一个空格,刚好把前面遗留下来的回车符“收走”了,在输入j变量的值时才不会错乱。其实这办法不一定最好,因为如果前面输入两个回车或几个间隔再回车,恐怕还不能解决问题。有人在前面的输入语句后加一句getchar()来“收取”遗留在缓冲区中的回车符,弊端和加一个空格一样。最好办法是是在前面的输入语句后或这个输入语句前加一句fflush(stein),这个函数能把缓冲区所有遗留清光……顺便说一句,scanf()在输入数字时一般不产生这个问题,但并非问题不存在,只是它在接收数字时只认数字,一旦遇其它符号就认为输入的一个数字结束。所以尽管多次输入数据的话可能缓冲区中会有很多“垃圾”,但并不影响它正确接收数据。
追问
我试过了,如果第一次输入两个回车或几个间隔再回车也是可以的,但我不知道这样为什么可以。
我头都大了。
追答
那你就冷静一下吧!就是说scanf()这个函数在接收数字时会把你最后输入的那个“回车”符遗留在输入缓冲区,而后面接收字符时却把这个回车当做你有意的输入了——因为回车也是个字符啊!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询