cin, cin.getline() 和 getline()详解

1. cin

cin 在默认条件下(无附加运算符重载)接受一个字符, 字符串或者整型, 例如:

int a;

cin>>a

输入的值为5, 则a的值被赋值为5

如果此时用户输入一个字符b, 此时a并不会被赋值为b的ASCII码, 而是返回一个0,这一点尤其要注意

另外有一种情况:

char a;

cin>>a,  此时如果输入一个字符串而不是一个字符,例如"abc", 则a只会被赋值为第一个字符,剩余的将会忽略不计, a=‘a‘

如果输入一个范围大于255的整数,例如输入700, 则700将不被看成一个整数,而是一个字符串,这样一来只取第一个字符, a=‘7‘, a其实等于55(7的ASCII码)

因此,对于一个未知输入,最可靠的方法是将输入的类型定义为一个字符串string,这样将不会遗漏字符数字以及一些特殊字符

cin也可以接受传入指针/地址,优点是在提前知道要输入字符的多少后可以很方便的存到静态数组中

char a[50]={‘\n‘};

cin>>a;

缺点也很明显,不如string更加灵活,必须提前知道最大可能输入的字符数才可以这样使用

cin在遇到空格,tab字符或者回车时会停止继续输入

 

2. cin.getline()

与cin不同,cin.getline()可以接收空格,直到碰到回车才停止

函数需要三个参数,其中两个是必须的参数,第一个是用来接收的指针/变量引用,第二个是偏移,即多少个元素需要接收, 第三个参数可有可无,可以指定结束字符

如果用户端输入的字符不足给定的元素个数,则只截取用户的元素,如果用户端输入的字符数目大于给定的,则按照给定的数目截取,空格也算在内

注意,在console中尽量不要使用tab,通常一个tab相当于是4个空格,但是在console中,一个tab相当于两个字符,如图, 提取10个值,中间空白部分是一个tab,占两个字符

cin, cin.getline() 和 getline()详解

 

 指定结束字符的用法:

char a[50]={‘\n‘};

cin.getline(a, 10, ‘b‘)

cout<<a<<endl;  结果只截取到前五个,直到遇到b字符

cin, cin.getline() 和 getline()详解

 

 利用这个特性可以方便的根据某个特殊字符截取输入的字符串,分割并保存,例如:

char a[50]={‘\n‘};

cin.getline(a, 10, ‘b‘);
cout<<a<<endl;
cin.getline(a, 10, ‘b‘);
cout<<a<<endl;
cin.getline(a, 10, ‘b‘);
cout<<a<<endl;

输入的字符为123b456b789b123b, 以字符b为分隔符,打印结果为

123

456

789

cin, cin.getline() 和 getline()详解

 

 

 

3. getline()

与cin.getline()不同,它属于string stream

getline(cin, str)  将输入流保存到str中去,过程中空格也一并接收,示例:

string mystring;
getline(cin, mystring);
cout<<mystring<<endl;

 结果:

cin, cin.getline() 和 getline()详解

 

 

 当同时使用cin和getline时,在输入流cin结束后需要清空缓存,否则下一个读入的并不是用户的输入而是一个回车

 例如:

string mystring;
int a;
cin>>a;
getline(cin, mystring);
cout<<mystring<<endl;

 

cin, cin.getline() 和 getline()详解

 

 

输入流赋值给a后,本想通过getline获取console中的mystring,却没有机会再进行输入了,这是因为cin之后的回车交给了mystring, 程序结束

 解决方法是插入一个函数用来接收\n,然后再调用自己的getline函数来接收之后的

 string mystring;

string buff;
int a;
cin>>a;

getline(cin,buff);
getline(cin, mystring);
cout<<mystring<<endl;

测试结果: 

cin, cin.getline() 和 getline()详解

 

cin, cin.getline() 和 getline()详解

上一篇:每天一个 Linux 命令(19):find 命令概览


下一篇:记Django使用redis作缓存