当在控制台输入数据时,所有的数据都是输入到缓冲区的,当从其中提取数据时,也是从缓冲区提取的!其有一个指向缓冲区的指针,就是通过此指针对数据提取的。
例如cin>>a;就是通过>>的重载实现从缓冲区取出数据并进行相应的转换后赋值给a;如果缓冲区没有数据的话,则等待用户输入数据。
1.对于从控制台读入数据到数据结构中,主要要了解的是:
1,读入的数据是什么(尤其针对字符串,是否包括空格,换行符等)。
2,读入数据后缓冲区的指针指向什么位置(缓冲区都指向读入数据的下一位)
通常读入的数据可以分为两种,一种是数值数据,例如int,float等。另一种是字符数据,包括单个字符和字符串。
对于数值数据,直接将数据读入到相关的数据结构中即可。指针指向数据的后一位。可以指向换行符!
对于字符数据,如果是单个字符读入的话,类似数值数据。也可以指向换行符!
对于字符数据,如果是读入字符串的话,则针对存储类型有不同的实现机制:
1.如果用c风格的字符数组保存字符串,则字符串的结尾一定是会添加0作为结束符的
2.如果用string保存字符串,则结尾一定是不增加0的。
char a[100];
cin.getline(a,100);//读入一行数据,同时将数据存放在a字符数组中,末尾添0,同时换行符不存储。(指针指向下一行开始!如果没有数据了则设置指针读完eof。指针指向下一行很容易理解,既然是getline,自然是将此行数据全部读完了,那指针指向下一位自然是下一行开始。只是在存储时将换行符舍弃了而已)
2.console程序中,按下enter键,输入数据进入缓冲区,后面的取数据操作都是在缓冲区中进行的。
当输入字符串时,主要要考虑到不同的输入函数对字符串的读取方式。包括空白字符是否读取,字符串末尾是否补‘\0’等。
对于各种输入函数作如下整理:
cin>>a;从缓冲区中取数据赋值给a,遇到空格,tab,enter结束。当a是字符串时,在a末尾添加0.(如果字符串长度>=a.len,最后一位不输入数据,输入0)
cin.getline(s,20,’\n’);给s赋值,遇到enter结束,不保存enter,同时在s末尾添加0(如果字符串长度>=20,最后一位不输入数据,输入0),也就是说s有效长度最多19,必须以0结尾。
getchar();从缓冲区中获取一个字符,可以是任何字符,包括空格,tab,enter等。
getch();直接用户在屏幕中输入一个字符,其就返回一个字符,不从缓冲区中取,其是针对屏幕的。
gets();从缓冲区读入字符串,当遇到enter时结束,不保存enter。遇到空格,tab保存,同时继续向后字符串末尾也补0.
scanf();根据参数形式确定了最终的赋值情况。
scanf(“%d,%d”,&a,&b)则屏幕应该输入10,20
scanf(“%d%d“,&a,&b)则屏幕输入10 20 或者10 tab 20 或者10 enter 20
当输入为字符串时,不读取enter,‘ ’,tab,末尾补0,但是读取‘ ’和tab,当输入字符时,读取enter(‘\n’)
3.对于接收从控制台输入的数据,可以采用如下规则:
1,对于行数不固定的输入,只需要有行输入结束的判断即可,由于行结束输入了,整个输入也就结束了,所以可以直接利用cin来判断,当整个输入结束时,cin 为false
2.,对于每一行的数据,如果数据的个数和数据的类型确定的话,则可以用cin>>a>>b…等方式来进行读入数据。
3,对于每一行的数据,如果行数据个数不固定,则在接收数据的同时需要判断行结束标志:可以采用如下两种处理方式:
对于数据间有空格的数据,可以用cin.get() != ‘\n’来持续输入:例如 123 ab 34 cd 334 def
对于数据间没有空格的输入,可以用stringstream来。例如123a34b324c
4.stringstream的使用注意点:
1.每次使用stringstream之前都要调用clear()函数清空。
2.stringstream是否结束是采用eof()函数来判断的,而不是像cin一样用此对象本身来判断,例子:
#include <iostream>
#include <sstream>
using namespace std;
string s;
stringstream ss;
int a;
char c;
while(getline(cin,s)){//s = 123A23B234C......
ss.clear();
ss<<s;
while(!ss.eof()){
ss>>a>>c;
}
}
5.读入单个字符的方法:cin.get(c);或者cin.get(),其返回值为char.
读入一行字符的方法cin.getline():其是iostream中的函数。getline(cin,s):其是stl中的函数.
1,char c[100]; cin.getline(c,100)//数据保存在字符数组中,如果字符数组开辟的小于一行的输入的话则会丢失相关数据
2,string s; getline(cin,s);//数据保存在字符串中,不存在1中的问题。
6.cin>>的使用:从缓冲区指针处开始,跳过空白符(空格,tab等)和换行符,取相关数据到变量中,直到遇到下一个空白符(空格,tab等)和换行符,结束。
如果数据无法转换,则cin返回false(cin返回false除了输入结束外,还有输入出错的情况!!)
string a;cin>>a;从缓冲区指针处开始,按照上面说明的方法,取数据放入a中。
int b;cin>>b;同上
char c[100];对于c风格的字符数组,方法同上,只是字符数组的最后都会自动补0的。