输入可以有三种方式:scanf(),getchar(),gets(),它们有哪些区别呢?
1. scanf()
功 能: 执行格式化输入
用 法: int scanf(char *format[,argument,...]);
scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。可以读入任何固有类型的数据并自动把数值变换成适当的机内格式。
其调用格式为: scanf("<格式化字符串>",<地址表>);
scanf()函数返回成功赋值的数据项数,出错时则返回EOF。
而scanf()是拥有缓冲区的,举个例子
程序运行到scanf()时会停止 请求外界输入
也许你输入了12然后回车了,但事实上 你从键盘上输入的是字符'1''2', 还有换行符'\n' (因为你键入了回车),在你按回车键之前,字符'1''2'都处于一个叫做缓冲区的位置里,回车键是特殊的,它先将字符'\n'添加到缓冲区,随后便清除缓冲区 ,将其中的所有字符发送到一个叫做输入列表的地方 ,scanf函数以及其他标准输入函数便会立刻从输入列表中获取内容
上述程序按照%d的规则从输入列表中获取字符 ,它获取了'1''2',并且将其转变为整数12,存入了变量n中,对于那些从输人列表中获取输入的函数 ,它们并不知道什么是整数 , 因为整数是编程中的概念,而无论是缓冲区还是输入列表,其中只有字符,所以“获取整数”只是从结果上看的,我们要求scanf获取一个整数到n中,它完成了但是并没有结束, 因为输入列表并不干净,回车符'\n'仍然留在输入列表中,第二个scanf将不会给你输入的机会 ,因为缓冲区中剩余的'\n'已经足够填饱ch的肚子,所以中间加一个getchar(),以获取‘\n’;
解决该问题的第二种方法是scanf(“ %d”,&num1),按格式输出前加一个空格;
2. scanf()与gets 的区别
(1),scanf()读句子的时候,会将所有的字符读入缓冲区中,而scanf()函数取数据是遇到回车、空格、TAB就会停止,不能获得一个句子;而gets()可以获得一个句子,因为gets没有缓冲区,所以可能会出现越界的情况;
但用以下方法可使得scanf获得一个句子:
3.getchar
我们可以用getchar 处理越界的情况:
如下:
其特点是:效率低,但是可以控制越界。
另外,C语言里提供了函数清空缓冲区,只要在读数据之前先清空缓冲区就没问题了!这个函数是fflush(stdin)。