对于一个刚刚接触C++的学者来说,C++的强大,令你叹服,也令你头痛----意味着我们需要掌握的知识是无穷无尽的!所以在学习的过程中需要掌握一定的学习方法,亦需要时刻地做一些笔记以提醒自己,又或者给一些初涉者提供一定的帮助!一下是本人在学习C++ Primer Plues时,对于C++三种输入法的一些笔记!
要想深入的学习C++的输入法,首先要对其输入法的流程有一定的了解,输入法是以流的形式输入的,即是说:I/O设备对于从键盘中的输入首先将其输入一个缓冲区中,形成一个输入队列,当你的程序中的语言对其进行响应的时候,再从其输入队列中一个一个或者一行一行地提取其字符流,要搞明白下面的输入过程,必须要对这个过程有一定的了解,熟悉其工作的原理!
1.cin的输入,首先来看看下面一个程序:
#include ”iostream“
#include " string"
const int size = 20;
int main ()
{
using namespace std;
char a[size];
cout << "Enter a string: ";
cin >>char;
cout << "The string is: " << char << endl;
return 0;
}
上面是一个简单的cin输入应用,当我们输入“aaaa”的时候,结果好显然是输入了”aaaa“,但当我们输入的是”aa aa“,它输出的却是”aa“,而为什么不是”aaaa“呢?!这是因为cin在获取字符数组的时候只读取一个一个的单词,当cin输入在遇到空白、空格、制表符和换行符的时候来定字符串的界,上面的输入”aa aa“,当读取到前面两个的时候,第三个是一个空格,所以cin就停止了对输入队列中的字符流的读取,所以只输出”aa“!
2.cin.get()和cin.geiline()的输入的区别
对于上面的输入问题,可以通过cin.get()和cin.getline()的输入方法来解决,这两个都是面向行输入的方法,对上面的程序进行修改:
#include ”iostream“
#include " string"
const int size = 20;
int main ()
{
using namespace std;
char a[size];
cout << "Enter a string: ";
cin.get(a, size);//or cin.getline (a, 20);
cout << "The string is: " << char << endl;
return 0;
}
这两种方法都是面向行的输入法,有两个参数,第一个参数是用来存储输入行的数组名,第二个参数是要读取的字符数,当它们遇到通过回车键有或者到达字符流的要求字数的时候,就会停止从输入队列中读取字符流!所以这两种输入法满足了条件,从而输出的结果为”aa aa“了!
讲到这里,先对这三种方法做个归纳:cin只是从输入队列中一个一个的读取字符流,而cin.get()和cin.getline()是面向行的输入,在输入队列中是一行一行的读取!紧记两点区别!
再来看看下面一个程序:
#include "iostream"
const int size = 20;
int main ()
{
using namespace std;
char name[size];
char sex[10];
cout << 'Please enter your name: ';
cin >> name;
cout << "Please enter your sex: ";
cin >> sex;
cout << "your name is: " << name << endl;
cout << "your sex is: " << sex << endl;
return 0;
}
当你运行上面的程序的时候,结果却不是你想象中的那样,输出如下:
Please enter your name: a a a;
Please enter your sex:
your name is: a
your sex is:
........
可以发现当你的一个输入的字符中没有存在着空格的时候,这个程序输出的还是和你想象中的一样,但当含有空格的时候,输出就不同了!这原因出于哪呢?!
这是因为当完成第一个输入的时候,其空格字符保留在了输入队列中,当第二个输入想读取的时候,读取到的就是空格字符,它就默认到了结尾,没有内容可以输入了,所以第二个输入什么也没有读取到!
当我将cin换回cin.getline ()和cin.get ()的时候,你就会发现cin.get ()和cin的结果一样,但cin.getline ()却成功了,这又是什么原因!?这是因为cin和cin.get()的输入方法是将换行符保留在输入队列中的,而cin.getline ()没有保留其换行符在输入队列中,如果不借助帮助,cin和cin.get()就会很难跨过该换行符,区别就在这里!这一点也需要紧记!
有什么办法解决这个问题呢?!
你可以通过这个输入方法来更改程序:cin.get().get() 这是因为cin.get () 将会返回一个cin的对象,所以这就相当于执行了两次cin.get()了,又或者你可以在cin和cin.get()的方法之后再加上一个cin.get(),即是:cin >> name; cin.get (); 或者 cin.get(a, 20); cin.get (); 。这个办法行得通是因为cin.get()可读取下一个字符(包括换行符),因此可以用它来处理换行符,为读取下一个输入做好准备!
其正确的程序如下:
#include "iostream"
const int size = 20;
int main ()
{
using namespace std;
char name[size];
char sex[10];
cout << 'Please enter your name: ';
cin >> name;
cin.get();
cout << "Please enter your sex: ";
cin >> sex;
cout << "your name is: " << name << endl;
cout << "your sex is: " << sex << endl;
return 0;
}
以上只是个人的一些肤浅的见解,对学习过程的一种归纳,希望各位可以能够多多指教!