基本使用

通过键盘将数据输入到变量中

  • 用法一:scanf(“输入控制符”,输入参数),
  • scanf,扫描的意思,意味着它会扫描你的所有键盘输入,然后从中找到符合格式字符串所指定格式的数据然后存入以输入参数的值为地址的变量中。
  • 输入控制符和输出控制符一致

    原理

    scanf函数可没有能力直接从键盘读取数据,它仅仅是从标准IO输入缓冲区读取数据而已,而这些缓冲区的数据来自于内核,内核数据才来自于键盘。

缓冲区没数据时scanf就会出现”卡死”的状态,等待用户的输入,按下回车以后就将控制台的字符写到了缓冲区里,scanf再从缓冲区里读出来。

由于scanf只是读取缓冲区的数据,因此如果数据个数跟scanf约定的不同时,这些数据将被残留在缓冲区内,影响scanf下次的运行。scanf读取正确数据当读取到格式不对的输入时就留在缓存区里了。

  1. # indlude<stdio.h>
  2. int main(){
  3. int i;
  4. scanf("m%d",&i);
  5. int j;
  6. scanf("m%d",&j);
  7. return 0;
  8. }
  1. 123m //i正确,j错误

scanf中的f

printf和scanf中的f的含义,f代表format(格式)。意思就是,scanf读取的内容必须与双引号之间的内容完全一致才能正确读入,但是空白字符是特例。

  1. # indlude<stdio.h>
  2. int main(){
  3. int i;
  4. scanf("m%d",&i);
  5. return 0;
  6. }
  1. 123 //错误
  2. m123 //正确
  3. m123n //正确

经常出现的scanf("%d,%d,%d",&a,&b,&c)被人诟病的原因

分隔符

用scanf函数接收3个数值,每个数值之间用空格隔开,那么在每输入一个数据后必须输入一个分隔符,分隔符可以是空格、tab、回车。
用scanf接受多个输入时最好在每个格式符之间加上一个字符或者控制,最好不要挨着。

scanf 的返回值

  • 正整数:表示正确输入参数的个数。
  • 0:表示用户的输入不匹配。
  • EOF:这是在stdio.h里面定义的常量(通常值为-1),表示输入流已经结束。在Windows下,用户按下CTRL+Z(会看到一个^Z字符)再按下回车(可能需要重复2次),就表示输入结束;Linux/Unix下使用CTRL+D表示输入结束。
    1. while (scanf("%s %c %c", str, &oldchar, &newchar) == 3) /* 或!= EOF , 但前者更好 */
    2. {
    3. ; //处理
    4. }

    读取过程

    scanf 会跳过所有的空白字符直到遇到第一个非空白字符才开始读取,会在第一个空白符结束或者如果规定输入宽度时会在末尾结束,或者