scanf的某些特性

2018-06-18 04:19:10来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

scanf是很敏感的,最好不要在scanf下做精度、场宽的设置,否则输入可能会失效。

例:

#include <stdio.h>

int main(void)
{
  int a = 0;
  scanf("%5d",&a);
  printf("a = %d",a);
return 0;
}

我运行这个代码,在输入整数小于等于5位的时候没问题,输出正确。当输入整数多于5位的时候,它只会读取到第五位,而不读取剩下的输入。那么那些多于五位的输入是丢弃了吗?不是的,这又是scanf的一个特性。当scanf()未能读取指定形式的输入时,它就留下这个不相容的输入,以供下次进行读取。

修改上述代码

#include <stdio.h>

int main(void)
{
  int a = 0;
  int b = 0;
  scanf("%5d",&a);
  printf("a = %d\n",a);
  scanf("%d",&b);
  printf("b = %d\n",b);
return 0;
}

运行结果如下

 

这个特性如果不加注意,可能在后续编程中遇到某些问题调试不出来,所以还是有必要理解一下的。

 

再看一个例子

#include <stdio.h>

int main(void)

{

  int a;

  int status = 0;

  printf("Enter an integer:(q to quit)");

  status = scanf("%d",&a);

  while(status = 1)

  {

     printf("Enter next integer:(q to quit)");

     status = scanf("%d",&a);

  }

  printf("Finished");

return 0;

}

 

这个例子本意是为了告诫大家,不要在应该使用==的地方使用=。

但也可以说明scanf的上述特性。运行该程序会发现,不输入q时程序运行正常,在输入q后,程序开始无限循环,用户没有机会进行更多的输入。WHY?

这是因为,输入q,status被设置为0,但是在循环判断时又把status重置为1并开始另一次循环。BESIDES,scanf想读取的使%d类型,即整型,而q不是整型,所以q不被读取,留在缓冲区等待下一个scanf读取。而当到下次循环时,读取前面留下来的q,scanf再次失败,这就是为什么用户无法再输入的原因。

 

 scanf下一个特性

scanf("%d",&a);该语句要读入一个整数,并将其赋给a。

当读入的不是整数时,有下列情况

1. 输入的是空白字符(制表符,空格,换行符),scanf会跳过空白字符直到第一个非空白字符处,然后它会一直读取字符,直到遇到空白字符,或遇到一个不符合正在读取的类型的字符。所以scanf("%d%d",&a,&b);   scanf("%d       %d",&a,&b);  scanf("%d                    %d",&a,&b);的行为是相同的

 

2. 输入的是不符合正在读取类型的字符,比如字母,它会保留这个不相容的字符,留待下一个scanf读入。

浮点数也类似。

 

但是对于%c来说,情况略微有所不同。

因为对于%c说明符,所有的输入字符都是平等的。如果下一个输入字符是一个空格或者换行符(不论是本次输入的还是之前遗留下来的),将会把这个空格或换行符赋给指定的变量;不会跳过空白字符。

但是!向格式字符串中添加一个空格将会导致一些区别。

命令scanf("%c",&ch);读取在输入中遇到的第一个字符,而scanf(" %c",&ch);则读取遇到的第一个非空白字符。

注意空格的位置是在%c整体之前,而非% c

 

这为我们提供了一种吃掉缓冲区换行符的思路。以往如果在scanf("%c",&ch);之前又scanf,我们不得不用fflush(stdin);或者添加一个%*c来吃掉换行符。但是现在,我们有了新方法,而且更加简便易行。那就是在以scanf(" %c",&ch);取代scanf("%c",&ch);

 

格式字符串中的空格意味着跳过下一个输入项之前的任何空格,注意,任何空格的概念也包括没有空格的特殊情况。

scanf("%d,    %d",&a,&b);将会接受下列任何一行输入

88,21

88,       21

88,           21  注意逗号是英文标点,且逗号要紧跟第一个数字

scanf("%d   ,    %d",&a,&b);将会接受下列任何一行输入

88,21

88  ,    21

88,           21

88                    ,

21

 

———————————————————————————————————————————————————————————————————————————

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:逗号运算符

下一篇:C语言范例学习01