前言
巩固一下基础知识, 水一篇关于多次测试的文章。
多次测试主要是用于ACM中的,所以对于竞赛的同学来说多次测试还是比较重要的。
多次测试主要分为一些数字啊, 还有字符串。数字其实没啥好说的,主要是字符串的就有一点点麻烦。
这里就话不多说,直接展示代码
一般写法及其原理
衍生(通常是比一般写法更加快捷和方便)
while(scanf("%d",&a)!=eof){...}
这是多次测试中最为基础和常见的一种,但是有些同学却弄不懂这其中的含义,所以今天特地来讲一下。
其实可以将以上的代码分为三个部分来看:
- while()循环: 有循环就有循环结束的条件,while(!=eof) 就是说只要值不是eof就不会结束,那eof 是啥呢? eof 相当于一个C里面的宏定义, 它的值是-1,所以while(!= eof)就说明程序不会结束。
- scanf("%d",&a); scanf 实际上是一个函数,它的返回值是一个int型,
就是说当你从键盘上输入一个数的时候,scanf()返回值为1. 如下图所示:
- 所以由此可知,只要你从键盘输入数据,while()就能一直执型,而不会终止,因为你输入数据时,scanf()不会返回-1, 所以怎样结束呢?
- 从键盘输入cort + z 键即可,这是程序会默认scanf的返回值为-1,所以就直接结束了。
由此 ,便可以衍生多种多次测试的写法:
c:
while(~(scanf("%d",&a)){....} //~ 按位取反, -1是条件不成立,退出。
while(scanf("%d",&a) != -1){....} //和第一种一样。
c++;
while(cin >> a) {.... } //我比较喜欢用这种嘻嘻嘻。
字符串多次测试
字符串其实和数字的差不多,一般考到多次测试直接用就完事了。
c:
while(scanf("%s",&str)){....} //无法接受空格
while(gets(s)){....} //可以接受空格
c++
while(cin >> str) {...} //string str 这个str 无法接受空格。
while(getline(cin,str)){...} //这个可以接受空格。