学c++有一段时间了,还没有进入到OOP的阶段,想把基础打牢一点,所以就从最基本的语法开始看起。因为有C语言的基础,所以刚开始感觉学起来也不是很难,大部分也都能理解,直到我遇到下面这个困惑,我才开始注意到c++中关于输入的一些问题。也许这些问题很基础,但是对于想真正学好这门语言的人来说,就必须注意这些细节。

while(!(cin>>golf[i]))
{
	cin.clear();
	while(cin.get()!='\n');
	cout<<"please enter a number:";
}

刚开始很困惑cin.get()这个部分,因为我感觉上面cin>>golf[i]不是已经输入数据了吗,后面还要cin.get()干嘛呢。后来查了一些资料,才了解到c++的输入和C语言是不一样的,c++的输入用到了缓冲区的概念。

缓冲区是将信息从设备传输到程序或者从程序传输给设备的临时存储工具。通俗地讲,缓冲区相当于一个大坝,上游(设备)下雨了(输入数据),大坝开始蓄水,蓄满(回车时)之后,大坝开闸放水,水流入下游(程序),从缓冲区的概念就可以解释上面的问题了。首先程序运行到cin>>golf[i]时,因为缓冲区是空的,所以可以一直输入,直到遇到回车。注意,这个时候数据是进入了缓冲区。输入完毕之后(例如:must回车),cin>>golf[i]将会从缓冲区中读取第一个字符,由于之前定义的golf数组是int型,所以返回false(程序的要求是输入整型数组),进入while循环。这时候cin.get()会继续从缓冲区读取数据,让数据从缓冲区流出,直到行尾。它的作用相当于删除之前的错误输入,把缓冲区清空。由于cin.clear()重置了输入,所以可以继续输入。如果没有这句代码,后果就是无限循环,因为数据如果定义的是int类型,cin将不断进行读取直到遇到非数字字符,所以遇到‘m’之后,便不再进行读取,而这个时候测试条件一直为真,就是无限循环了。下面总结一下c++的几种常见输入方式:

1、cin>>

int a;
char ch;
int b[5];
cin>>a;
cin>>ch;
for (int i;i<5;++i)
cin>>b[i];


这没什么好说的,直接输入。输入数据之后,cin会根据定义的数据类型从缓冲区中读取。另外如果cin>>b[i]位于循环中,那么该表达式将返回bool类型。

2、cin.get()


char ch;
cin.get(ch);
while(cin.fail()==false)
{
	cout<<ch;
	cin.get(ch);
}


每次读取 一个字符,与cin>>ch不同的是,这种方式可以接受并计算空格等字符。

3、cin.get(str,size)、cin.getline(str,size)

const int size=20;
char name1[size];
char name2[size];
char name3[size];
cin.getline(name1,size).getline(name2,size);
cin.get(name3,size).get();


这两种 输入方式都是 处理字符串的,第一个参数设置的输入字符串的内存单元地址,第二个参数比输入的字符数大一(包含空字符),还可以接受第三个参数,表示分界符,遇到分界符后输入停止。不同的是,cin.get()把换行符(或者分界符)留在缓冲区内,接下来的输入将首先看到换行符,而cin.getline()则丢弃了换行符。当输入的字符超出限制时,这两种方式都只接收size-1个字符加空字符。cin.getline()使用起来简单一些,但是尽量使用cin.get(),便于查错。

4、ch=cin.get()


int ch;
int count=0;
while((ch=cin.get())!=EOF)
{
	cout.put(char (ch));
	++count;
}


无参数的 cin.get()返回的是输入中的下一个字符,所以是char型。

5、getline(cin,str)

string str;
getline(cin,str);


这种方式主要用于string类字符串的输入。