c++中cin>>、cin.get()、cin.getline()、getline()的用法

输入原理:

程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入.

一、cin>>

  • 读取时结束条件:enter, space, tab
  • 对结束符的处理:不读取enter,space, tab,不丢弃缓冲区中的Enter
#include <iostream>
using namespace std;
int main()
{
  char name[2];
  cin>>name;
  cout<<name<<endl;
}

 

注意:当输入字符过长时,正常输出,不会受到数组长度限制。原因:C++不做边界检查,即使超限了,也不会管,但会影响到缓存区的其他数据。

二、cin.get()

2.1cin.get读取一个字符

读取一个字符,可以使用cin.get(有参数)=cin.get(void)

  • 输入结束条件:换行符
  • 对结束符处理:不读取enter,不丢弃缓冲区中的Enter

示例代码如下:

#include <iostream>
using namespace std;

int main()
{
    char a;
    char b;
    cin.get(a).get();
    b=cin.get();
    cout<<a<<b<<endl;
    return 0;
}

问题: 连续两次调用get():由于第一次调用后,换行符留在缓存中,第二次调用时便会调用第一次调用的换行符,此时,第二个get()认为以及到达行尾。

解决方案4种

1 cin.get(name, Arsize);
 cin.get();
 cin.get(dessert, Arsize);
2. 或者是cin.get(name, Arsize).get();
3.使用cin.sync()函数
4.使用cin.ignore()函数



#include <iostream>
using namespace std;

int main()
{
    char a;
    char b;
    cin.get(a);
    cin.sync();
    b=cin.get();
    cout<<a<<b<<endl;
    return 0;
}

int main()
{
    char a;
    char b;
    cin.get(a).get();
    b=cin.get();
    cout<<a<<b<<endl;
    return 0;
}
int main()
{
    char a;
    char b;
    cin.get(a);
    cin.get();
    b=cin.get();
    cout<<a<<b<<endl;
    return 0;
}

int main()
{
    char a;
    char b;
    cin.get(a);
    cin.ignore();
    b=cin.get();
    cout<<a<<b<<endl;
    return 0;
}

 2.2cin.get读取一行字符

cin.get(数组名,长度,终止字符(可以指定特定字符)(可以省略)

  • 输入结束条件:指定特定字符为终止符(省略时回车为终止符)
  • 对结束符处理:不读取enter,不丢弃缓冲区中的Enter,结尾添加空字符,输出长度-1。
#include <iostream>
using namespace std;
main ()
{
char a[20];
cin.get(a,20);
cout<<a<<endl;

 输入:jkl jkl jkl
输出:jkl jkl jkl

输入:abcdeabcdeabcdeabcdeabcde (输入25个字符)
输出:abcdeabcdeabcdeabcd              (接收19个字符+1个'\0')

三、cin.getline()

cin.getline(数组名(不可以是字符串),长度,终止字符(可以省略))

  • 输入结束条件:换行符
  • 对结束符处理:丢弃缓冲区中的Enter,并用空字符代替,输出长度减-1
#include <iostream>
using namespace std;

main ()
{
char a[3];
cin.getline(a,3);
cout<<a<<endl;
}

输入123
输出12

四.getline()

用于接收一个字符串,可以接收空格并输出,需包含#include <string>

常见的getline()函数语法有两条:

1) istream& getline ( istream &is , string &str , char delim );
2) istream& getline ( istream &is , string &str );

 delim 终结符,遇到该字符停止读取操作,不写的话默认为回车。
  如:第一种为可以定义的间隔符,第二种为回车结束.

注意:
1、当getline与whlie一起使用的时候,即while(getline(cin,str))是一个死循环,只有当按Ctrl+z或键入EOF才会结束。
2、当使用getline的时候,如果前面用cin输入东西,则必须输入cin.get()吃掉回车符.

#include<iostream>
#include<string>

using namespace std;

int main ()
{
    string str;
    getline(cin,str);
    cout<<str<<endl;
    return 0;
}

输入:jkljkljkl
输出:jkljkljkl

输入:jkl jfksldfj jklsjfl
输出:jkl jfksldfj jklsjfl

五、cin清空输入缓冲区

  1.  程序中使用cin.ignore清空了输入缓冲区的当前行,使上次的输入残留下的数据没有影响到下一次的输入,这就是ignore()函数的主要作用。
  •   cin.ignore(int intExp, char chExp); 

其中intExp 是一个整型表达式,也可以是一个整型数值,这个数值表示在一行中忽略的字符的最大数目,比如说intExp=100;还有一个参数chExp,是一个字符表达式。表示如果遇到一个字符值等于chEXP,那么就停止ignore(),如果ignore100个字符之后还没遇到值等于chEXP的字符,那也得停止ignore(),所以100是ignore()所忽略的最大字符数。

  •  或者使用:cin.ignore(numeric_limits< std::streamsize>::max());我在使用code::blocks时报错,不知道其他编译器的使用情况。

其中,numeric_limits::max()不过是头文件定义的流使用的最大值,你也可以用一个足够大的整数代替它。

  • 如果cin.ignore()不给参数,则默认参数为cin.ignore(1,EOF),即把EOF前的1个字符清掉。
#include<iostream>
#include<cstdlib>
using namespace std;

int main()
{
  int ival1 = 0, ival2 = 0,ival3=0;

  cin >> ival1;
  cin.ignore(100, '\n');
  cin >> ival2;
  cin.ignore();
  cin>>ival3;
  cout << "ival1 = " << ival1 << endl;
  cout << "ival2 = " << ival2 << endl;
  cout << "ival3 = " << ival2 << endl;
  return 0;
}





输入:
12 34 56
78 90

输出:
ival1 = 12
ival2 = 78
ival3 = 78

2、cin.sync();

 2.C++之cin(三)——关于cin.sync_Elegie_的博客-CSDN博客_c++ cin.sync

3、cin.clear();参考下面的文档,我自己还是不能够理解,但是他总是和cin.clear()结合在一起使用

C++中cin.clear()的用法 - 蝴蝶狼 - 博客园

总结:

  • cin.ingore()和cin.clear()是一起使用的。
  • 一般不要使用cin.sync(),他的作用并不是删除数据流。

结尾

总结:

  • cin读取词,getline 和get读取行
  • 区分需要输入的是数组还是字符串,getline()中需要输入的是字符串。
  • cin.getline与cin.get的区别是,cin.getline不会将结束符或者换行符残留在输入缓冲区中。 
  •  getline()和cin.getline()类似,但是cin.getline()属于istream流,而getline()属于string流,是不一样的两个函数。

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值