重庆网站建设网站建设,做体育直播网站,阿里网站搭建,深圳网站建设公司联系前言、scanf函数有返回值
我们在作PTA上的编程作业时#xff0c;经常在编译窗口会看到如下的信息#xff1a;
warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
当时老师一定会告诉你#xff0c;这个一个经常在编译窗口会看到如下的信息
warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
当时老师一定会告诉你这个一个warning的报警可以不用管它也确实如此。不过这条报警信息我们至少可以知道一点就是scanf函数调用完之后是有一个返回值的下面我们就要对scanf返回值进行详细的讨论。并给出在编程时利用scanf的返回值可以实现的一些功能。
一、scanf的返回值
我们先来看一个例子。
输入
3 5
代码
#include stdio.h
int main () {int a,b,c;c scanf(%d%d, a, b);printf(the return value of scanf is: %d\n, c);return 0;
}
输出
the return value of scanf is: 2
从这个例子我们可以看出scanf函数确实是有返回值的。当我们执行上面的代码并输入两个数3和5时首先会执行scanf函数的调用输入了两个整数(完成输出后scanf就有了返回值)然后执行printf函数按照格式把scanf的返回值输出。从这个例子我们也可以大胆的猜测scanf函数的返回值就是scanf正确读入的变量的个数。这个猜测对了一半完整的表述应该是
scanf函数的返回r满足1当输入流中有输入时r等于scanf函数正确读入的变量的个数2当输入流中没有输入时r等于-1。
注意没有输入和没有正确输入是不一样的情况我们下来举例说明。
代码
#include stdio.h
int main () {int a,b;printf(%d\n, scanf(%d,%d, a,b));return 0;
}
对于上面 的代码我们分别给出三个输入和输出的例子来说明。
输出1
3 5
输出1
1
注意代码中scanf函数调用的第一个参数也就是格式匹配字符串为%d,%d而输出流中的输入为3 5。显然对输入流中的3scanf函数可以正确输入然后按照格式匹配字符串3后面应该匹配一个,但是输入流里面却没有正确匹配所以scanf就无法继续输入而返回。因为已经有了一个正确输入故返回值就是1。
输出2
,3,5
输出2
0
这个例子中输入流中第一个(非空白)字符,就与匹配字符串种的第一个字符%d不匹配从而scanf函数无法继续输入而返回。这时并没有正确输入故返回值是0。
输出3
^Z
输出3
-1
注意输入3中的输入并不是^Z而是在windows下用ctrlz模拟了没有任何返回值在mac下用ctrld在PTA平台上就是输入为空。这时输入流中根本没有任何输入故返回值是-1。 二、scanf函数返回值的妙用
我们经常在PTA作业里遇到这样的输入问题就是需要你输入一些数据但是又没有告诉你这些数据一共有多少个这时候我们用scanf的返回值就可以解决这个问题。
举一个具体的例子要求输入一组整数并且按输入次序输入这组整数的奇偶奇数输入1偶数输出0。
输入样例
12 23 34 45 56 67 78 89 91 13 24 35
输出样例
0 1 0 1 0 1 0 1 1 1 0 1
代码
#include stdio.h
int main () {int a;while(scanf(%d, a) ! EOF) {printf(%d , a%2);}return 0;
}
上面的代码我们用了while循环结合scanf函数的返回值完成了对未知个数据的输入。具体来说while的循环条件就是scanf(%d, a) ! EOF这了EOF就等-1直接写成-1也可以。当输入流中还有输入时scanf(%d, a)的返回值就不可能等与-1循环条件为真循环就继续。当scanf扫描的输入流的末尾没有东西可以输入时scanf(%d, a)返回-1循环条件为假循环结束。
注意如果输入的是若干个字符中间用空格隔开则需要在匹配字符串中适当的位置匹配空格。