可能大家学习C语言的时候没弄清gets和scanf的区别,都是接受输入的函数,两个 什么区别呢?二者是否可以互换呢?
scanf与gets的不同在于:
scanf("%c",&cc)不支持空格、制表符、回车换行,遇到上述内容将引发参数中止;但是连续输入多个字符的时候可以如下操作
for(i=0;i<10;i++)scanf("%c",c[i]);//输入时可以连续输入:abcdefghij 而不必输一个回车一次。这里还有一个只出现在字符串情况的问题就是数组真正到缓冲区里去取值的时候值是这样排列的,a回车符b回车符c回车符d回车符。。。所以程序执行会出现错误。
gets仅不支持回车换行,即遇到回车换行引发参数终止。
scanf、gets不可混淆互换。
另外,有些情况下需要连续两个scanf,会出现只输入了一次就被跳过的情况,例如下面的语句:
void CreateBT(BiTree T)
{
char c;
printf("please input the node character:\n");//提示输入节点数据
scanf("%c",&c);
if(c=='#')
{
T=NULL;
return ;//当遇到输入结束符的时候,注意要返回。递归的层次越高,叶子节点就越多,需要输入的#就越多
}
else
{
T=(BiTNode *)malloc(sizeof(BiTNode));
T->data=c;
}
CreateBT(T->lchild);
CreateBT(T->rchild);
}
首先说明的是上面的情况出现在输入字符的时候,如果改为输入char c[20]就不会出现上述情况,其实说明的是造成上述情况的原因是在输入a后你肯定按了回车键,此时a和回车键同时存入键盘的缓冲区,然后将a取出赋值给变量c,等到下一次运行的时候再从键盘缓冲区中取时会取到回车赋给c,这样第二次执行的时候就会被跳过。
但是经常我们会利用键盘缓冲区这一特性来进行输入,比如我们直接输入abc####这样不用每执行一次就输入一次,这些字符会依次赋值给每次用到的变量。
利用abc####的方式输入即使输入了回车符程序也已经执行完了该函数,再执行其他函数时,方法一,就是在其他函数使用scanf 前加一个清除键盘输入缓冲区的函数,fflush(stdin);这样就可以了,但是这样做导致每输入一个字符就要Enter/Tab/空格一次,比较麻烦。
看到有的同学使用如下方法,比较可行,就是在scanf("%c",c[i]);后加一句getchar();这样回车符就被getchar()过滤掉了,遇到上述问题时推荐大家使用这个方法。