校招知识点总结C++(一) 处理输入
对于没有明确给定输入输出的一律强烈谴责,why???
- 对于一些算法题中,没有明确的输入输出。我们只能猜测是根据空行,还是文件终止符,这个太难了。
一、首先明确下c++怎么处理输入
首先是C语言中 pritf和scanf中函数。由于是c++,不做太多扩展。
然后是c++中的输入。本人建议熟练掌握两个就好,我就是掌握cin和string 的getline。
cin
cin从缓冲区接收数据,直到遇到空格、TAB、回车停止,但需要明确的是这些空格、TAB、回车会仍停留在缓冲区中。
从这个程序中,我们可以验证这一点。而且继续思考,可以想出,cin会在开始时,碰到空格、回车和TAB会自动提取出,知道碰到非上面几个字符。
#include<iostream> #include<string> #include<vector> #include <sstream> using namespace std; int main() { string a; cin>>a; cout<<a<<endl; if(getchar() == '\n') { cout<<a.size()<<endl; cout<<" can not deal '\\n'"<<endl; //回车是否还在还在缓冲区中 } if(getchar() ==' ') { cout<<a.size()<<endl; cout<<"can not deal ‘ ’"<<endl; //空格是否还在缓冲区中 } }
getline
这是string中的getline,需要包含#include<string>。还有一个cin.getline(char *),这个需要用字符数组,我更愿意用string,所以没太在意这个,但应该差不多。
getline(cin,str,'\n')。有三个参数,第一个是cin,第二个是数组,第三个是终止符,默认是回车,也可以自己设定。
从上面的终止符中可以看出,并不是表面意思,一次取一行,可以更改终止符为‘,’ 这样遇到‘,’就会终止。
特性:getline 函数只对终止符敏感,遇到终止符就会停止,但会把终止符从缓冲区剔除。
这里有个区别:
cin:遇到空格、回车、TAB就会停止,但这不是一开始,而是在读取到有效数据后,否则会一直过滤,把这些字符从缓冲区剔除,直到读取到有效数据。
getline:则不一样,会提取终止符之前的数据,不管有没有指,所以可能提取到空值。这也是没有终止条件用来判断终止的一种情况。
从下面这个程序来测试。
string a; // cin>>a; string b; // cin>>b; getline(cin,a); getline(cin,b); cout<<a<<b<<endl;
二、判断终止条件
1.上面已经说过判断读取空值的一种情况。
2.文件终止符,这个后续看补充,我用自己IDE模拟终止符出不去,就很尴尬。后续看下C++ primer的例子试下。