scanf () 小陷阱。

来源:互联网 发布:js 清除 cookie的方法 编辑:程序博客网 时间:2024/05/23 00:00
1、scanf ()的返回值:
 scanf()函数返回成功读入的  项目的个数。
如果它没有读取任何项目(当它期望一个数字而您却键入了一个非数字字符串时),scanf()返回0。
还有就是例如
i=scanf(“%d”,&a);
当键入10时,scanf()将值赋给a,即a的值为10,返回值为成功读入的项目个数,即i为1.
当键入字符‘a’时,scanf()由于无法读入整数,‘a’会被放到输入队列中而无法被读取。同时scanf()返回0赋给i,i的值即为0.
当它检测到文件结尾(end of file)时。它会返回EOF。一般#define EOF -1;

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

2、scanf("%*d %*d %d",&i);函数会 跳过 第一个第二个输入项目。直接读入第三个。
因为* 为滞后赋值。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

3、scanf()把一个 字符串 读进一个字符数组的时候。不使用取地址符&

因为数组名字本身就代表该数组的首地址和首个元素的地址。

例如: char a[30];
     scanf("%s",a);
   即对char数组不用使用&。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

4、scanf()除了对字符型即char字符 %c 以外。对于其他形式数据的读入是直到读到不能表示其数据类型的
字符为止的下一为能表示其数据类型的字符。
例如 对字符串的读入是读到空白字符的下一位。如果下一位是字符,那么scanf()就认为本次输入已经
读取完成,打印时只输出前半段,而把空白字符以后的保留在缓冲区成为下一次读取的结果。
例如:
char name[30];
printf(“Please enter your favourite NBA superstars\n”);
scanf("%s",name);//此处不用取地址运算符& ,见3、
printf("My favourite superstar is %s.\n",name);
如果我输入的是 Lebron James
那么输出的只是Lebron 因为字符串中间有空格,即空白字符,导致scanf()误以为James是下一个键入输入。


解决的方法有很多。比如:
char name[30];
char name2[30];
printf(“Please enter your favourite NBA superstars\n”);
scanf("%s",name);
scanf("%s",name2);
printf("My favourite superstar is %s %s.\n",name,name2);
这样做是基于scanf()在读取字符数组name的时候已经把Lebron James 都读入进了缓冲区,而且误以为
是两次键入结果。所以name2里自动被存入了James而不用使用者在去键入。
最后打印结果为 My favourite superstar is Lebron James.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

5、scanf()对于字符而言,即scanf(“%c”,&a);这种类型。scanf()对于字符类型的数据在读入时
每个字符都会读取。也就是说包括空白字符(tab,空格,回车等)。
例如:
char i,j;
printf(“Wash face?\n”);
scanf("%c",&i);
printf("Brush teeth?\n");
scanf("%c",&j);
if (i=='N' && j=='N')
{
   printf("You go fucking dying!!!\n");
}
运行这个例子时你会发现无法键入j的值。
这是因为在scanf()读入i的值的时候,也将回车键读入进了缓冲区,作为下一次读入的结果,即j的值。
致使j的值变为回车键,所以函数不能正常运行。



解决方法:
在第一个scanf()格式化输入函数后面紧接一个getchar()函数。
getchar()函数在此处的作用是读掉第一次键入时的回车键。即
将缓冲区保留的第一次读取的回车键读掉。
使函数能够正常的运行。

原创粉丝点击