您的位置:首页 > 其它

有关scanf的输入函数的一些问题

2011-05-23 00:17 447 查看
在这次的上机实验的时候,遇到一个有关scanf输入字符的问题,是这么一个语句
for(int i=0;i<6;i++)
scanf("%c",&ch[i]);
是图的遍历实验,这段语句是在建立图的时候,要求输入各个节点的名字,在输入的时候,我输入一个就敲回车,把它送入缓冲区,结果回车也被存储了起来,也就是说我本来想存储一个字符,结果却把回车这个字符也存了起来,这并不是我想要的结果,于是就研究了下scanf这个函数,忙活了半天,算是勉强搞懂了。
http://blog.sina.com.cn/s/blog_61afc1390100gte2.html
这个是有关缓冲区介绍的blog,有一个缓冲区有数据,却还不断提示要求输入数据的一个程序
http://zhidao.baidu.com/question/145325291.html
上面这个讲了有关输入字符后,以字符和整数不同方式存储的时候,回车的不同作用,总结起来就是,1.如果要求是以整数的方式存储输入的字符,则最后的回车符会自动略去.2.如果要求是以字符的方式存储输入的字符,则回车符也会留在缓冲区,直到下一个要求从缓冲区取数据的函数出现,如果该函数是取字符,则会把该回车符送给该函数,如果该函数要求取整型数据,则会忽略该回车符,直到有下个字符输入(如果这个字符是字母或其他,反正不是数字的话,就会出现第一个blog上提到的无限循环的情况)。3.如果是输入字符串,则在碰到空格或者回车的时候结束字符串,所以,虽然我们可以在代码中定义的字符串里面带有空格,但如果是要求输入字符串的时候,空格是不能输入进去的,如果可以经过上面特殊处理话说不定可以。
这个是scanf输入的基本问题,搞懂不是很难,在格式控制中的空格和其他一些字符的问题很难搞懂,网上的资料也很少,便自己摸索了一番,经过大量调试,算是摸清了。
1. 如果格式控制中有一般字符(就是除了空格外的字符),则在输入的时候,必须照着格式将这个字符输入,否则,就会放弃scanf函数中后面还有的输入,也就是说,这句scanf函数就这么结束了
例子:
#include<stdio.h>
int main()
{
char ch[10]="123456789";
char cha[10]="123456789";
for(int i=0;i<10;i++)
{
scanf(",%c",&ch[i]);//注意%c前面有一个逗号
}
scanf("%s",cha); 注意%c前面没有逗号
printf("这是ch:%s/n",ch);
printf("这是cha:%s/n",cha);
fflush(stdin);
getchar();
return 0;
}
//abcdefghi
//这是ch:123456789
//这是cha:abcdefghi
分析:当把abcdefghi送入缓冲区后,scanf读取字符,当扫描到格式控制中的逗号的时候,会检测缓冲区的第一个字符是否是逗号,不是,那么久放弃本次输入,然后直到循环完毕,但是缓冲区的字符还在那里没有变,所以当执行scanf("%s",cha);的时候,就直接从缓冲区读入数据存储到数组当中。
2.
如果格式控制中有空格,那么该空格就会起着吸收空格和回车的左右,也就是说,如果在检测空格和缓冲区中的字符匹配的时候,如果缓冲区的字符是空格或回车,则空格会吸收缓冲区的空格和回车,使其离开缓冲区,直到有下一个非空格或回车符出现,空格的作用才会执行完毕
例子:
#include<stdio.h>
int main()
{
char ch[5];
int i;
for(i=0;i<4;i++)
{
scanf("%c ",&ch[i]);//注意,%c后面有一个空格
printf("这是第%d个元素,它的值是%c/n",i,ch[i]);
}
ch[i]='/0';
printf("这是这个数组的值%s/n",ch);
fflush(stdin);
getchar();
return 0;
}
输入和输出结果:
a
b
这是第个元素,它的值是a
c
这是第个元素,它的值是b
d
这是第个元素,它的值是c
e
这是第个元素,它的值是d
这是这个数组的值abcd
分析:执行到scanf的时候,缓冲区里面没有数据,等待用户输入,当用户把a和回车符送入缓冲区后开始扫描,把第一个字符a以字符的形式存储起来,然后扫描到空格,检测到缓冲区里面剩下的回车符,于是就把回车符吸收了,直到有非空格和回车符送到缓冲区,于是继续提示我们输入,当把b和回车符送入缓冲区后,刚才的空格检测到b这个字符,于是这句scanf函数输入完毕,然后执行printf函数,然后接下来的循环执行上面的事情。
到这里我上面的问题基本上就解决了,可以这样写 scanf(" %c",&ch[i]);,在%c前面加一个空格,这样就会把多余的空格和回车给吸收掉,就能保证我输入的是想要的结果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: