为什么有时不应该用scanf()来接收数据?
尽管在读取键盘输入时,scanf()是用得最多的函数,但有时最好还是不使用scanf()。这些情况可以分为以下几类:
必须立刻处理用户所击的键
如果你的程序要求一旦某键被按下,就要立刻做出反应,那么scanf()就没有用了。scanf()至少要等到Enter键被按下后才会做出反应,而你根本不知道用户什么时候才会按下Enter键——也许是一秒钟以后,也许是一分钟以后,也许是一个世纪以后。
尽管在实时程序中,例如在计算机游戏中,用scanf()来读取键盘输入是很糟糕的,然而在通用的实用程序中,这同样也是很糟糕的。例如,在操作一个由字母组成的菜单时,用户肯定喜欢只按a键,而不是按完a键后再按一下Enter键。
遗憾的是,标准C函数库中并没有能立刻响应用户击键的函数,因此你只能依靠辅助函数库或编译程序所带的一些特殊函数。
当scanf()对输人进行分析时,你所需要的数据可能会被忽略掉
scanf()是一个很精明的函数——有时精明得过分了。为了满足用户对输入数据的要求,scanf()会跳行,会丢掉不合适的数据,并且会忽略空白符。
然而,有时你并不希望scanf()精明到这种程度!有时你想把用户所键入的内容全部看作是输入,不管它是太多还是太少。一个不适合使用scanf()的例子就是要从用户那里接受文本态命令的程序一一事先你并不知道用户要键入的句子中会有多少个单词。在这种情况下,就不能使用scanf(),因为你不知道用户什么时候才会按下Enter键。
预先不知道用户会输人哪种类型的数据
有时,你已经准备好要接受用户的输入,但你不知道用户将输入一个数字,还是一个词,或者是某个特殊的字符。在这种情况下,你必须按某种中性格式,例如字符串,来接受用户的输入,并且在继续下一步操作之前判断输入的数据是哪一种类型。
此外,scanf()还会带来这样一个问题,即它会把不合适的输入保存在输入缓冲区中。例如,如果你期望读入一个数字,而用户却输入了一个字符串,那么有关的代码可能会无限循环下去,因为它试图把这个字符串当作一个数字来分析。下面这个程序演示了这一点:
#include<stdio.h>
main()
{
int i;
while(scanf("%d",&j)==O)
{
print{("Still looping.\n");
}
return(O);
}
如果你象程序所期望的那样输入了一个数字,那么这个程序完全能正常运行。但是,如果你输入了一个字符串,那么这个程序就会无限循环下去。
必须立刻处理用户所击的键
如果你的程序要求一旦某键被按下,就要立刻做出反应,那么scanf()就没有用了。scanf()至少要等到Enter键被按下后才会做出反应,而你根本不知道用户什么时候才会按下Enter键——也许是一秒钟以后,也许是一分钟以后,也许是一个世纪以后。
尽管在实时程序中,例如在计算机游戏中,用scanf()来读取键盘输入是很糟糕的,然而在通用的实用程序中,这同样也是很糟糕的。例如,在操作一个由字母组成的菜单时,用户肯定喜欢只按a键,而不是按完a键后再按一下Enter键。
遗憾的是,标准C函数库中并没有能立刻响应用户击键的函数,因此你只能依靠辅助函数库或编译程序所带的一些特殊函数。
当scanf()对输人进行分析时,你所需要的数据可能会被忽略掉
scanf()是一个很精明的函数——有时精明得过分了。为了满足用户对输入数据的要求,scanf()会跳行,会丢掉不合适的数据,并且会忽略空白符。
然而,有时你并不希望scanf()精明到这种程度!有时你想把用户所键入的内容全部看作是输入,不管它是太多还是太少。一个不适合使用scanf()的例子就是要从用户那里接受文本态命令的程序一一事先你并不知道用户要键入的句子中会有多少个单词。在这种情况下,就不能使用scanf(),因为你不知道用户什么时候才会按下Enter键。
预先不知道用户会输人哪种类型的数据
有时,你已经准备好要接受用户的输入,但你不知道用户将输入一个数字,还是一个词,或者是某个特殊的字符。在这种情况下,你必须按某种中性格式,例如字符串,来接受用户的输入,并且在继续下一步操作之前判断输入的数据是哪一种类型。
此外,scanf()还会带来这样一个问题,即它会把不合适的输入保存在输入缓冲区中。例如,如果你期望读入一个数字,而用户却输入了一个字符串,那么有关的代码可能会无限循环下去,因为它试图把这个字符串当作一个数字来分析。下面这个程序演示了这一点:
#include<stdio.h>
main()
{
int i;
while(scanf("%d",&j)==O)
{
print{("Still looping.\n");
}
return(O);
}
如果你象程序所期望的那样输入了一个数字,那么这个程序完全能正常运行。但是,如果你输入了一个字符串,那么这个程序就会无限循环下去。