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

输入原理:

程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据。

正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接从缓冲区取数据而不会请求键盘输入

#include <iostream>
using namespace std;
int main()
{
    char str[8];
    cin.getline(str, 5);
    cout<<str<<endl;
    cin.getline(str, 5);
    cout<<str<<endl;
    return 0;
}
测试:
    输入:
        abcdefgh
    输出:
        abcd
        abcd 
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

一. cin>> 
该操作符是根据后面变量的类型读取数据。

  • 输入结束条件 :遇到Enter、Space、Tab键。

  • 对结束符的处理 :丢弃缓冲区中使得输入结束的结束符(Enter、Space、Tab)

cin>>是直接从缓冲区取数据的,遇到结束符号停止。如果还调用cin,则继续取缓存区剩余的数据。

#include <iostream>
using namespace std;
int main()
{
   char str1[10], str2[10];
   cin>>str1;
   cin>>str2;
   cout<<str1<<endl;
   cout<<str2<<endl;
   return 0;
}
测试:
    输入:
        abcd efgh
    输出:
        abcd
        efgh
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

二.cin.get(数组名,长度,结束符) 
读取字符的情况:

  • 输入结束条件:Enter键

  • 对结束符处理:不丢弃缓冲区中的Enter 
    注意: 
    (1)读入的字符个数最多为(长度-1)个 
    (2)结束符为可选参数,结束符规定结束字符串读取的字符,默认为ENTER 
    (3)若要读取字符,直接cin.get(char ch)或ch=cin.get()即可

测试读取字符输入:

#include <iostream>
using namespace std;
int main()
{
  char c1, c2;
   cin.get(c1);
   cin.get(c2);
    cout<<c1<<" "<<c2<<endl; // 打印两个字符
    cout<<(int)c1<<" "<<(int)c2<<endl; // 打印这两个字符的ASCII值
    return 0;
}
测试:
    输入:
        a
    输出:
        a 

        97 10

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

【分析】会发现只执行了一次从键盘输入,显然第一个字符变量取的’a’, 第二个变量取的是Enter(ASCII值为10),这是因为该函数不丢弃上次输入结束时的Enter字符,所以第一次输入结束时缓冲区中残留的是上次输入结束时的Enter字符!

测试二读取字符数组输入:

#include <iostream>
using namespace std;
int main ()
{
  char ch, a[20];
  cin.get(a, 5 , 'd');
  cin>>ch;
  cout<<a<<endl;
  cout<<(int)ch<<endl;
  return 0;
}
测试一:
    输入:
        12345[Enter]
    输出:
        1234

        53

测试二:
    输入:
        12d45
    输出:
        12

        d

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

【分析】第一次输入超长,字符串按长度取了”1234”,而’5′仍残留在缓冲区中,所以第二次输入字符没有从键盘读入,而是直接取了’5′,所以打印的ASCII值是53(’5′的ASCII值)。第二次输出为d,说明自定义结束符时不丢弃缓冲区中的结束符。 
三.cin.getline() 
cin.getline(数组名,长度,结束符) 大体与 cin.get(数组名,长度,结束符)类似,两者的区别:

  • cin.get()当输入的字符串超长时,不会引起cin函数的错误,后面的cin操作会继续执行,只是直接从缓冲区中取数据。
  • 但是cin.getline()当输入超长时,会引起cin函数的错误,后面的cin操作将不再执行。
#include <iostream>
using namespace std;
int main ()
{
  char ch, a[20];
  cin.getline(a, 5);
  cin>>ch;
  cout<<a<<endl;
  cout<<(int)ch<<endl;
  return 0;
}

测试:
    输入:
        12345
    输出:
        1234

        60
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

【分析】与cin.get()的例子比较会发现,这里的ch并没有读取缓冲区中的5,而是返回了60(这个结果,每次都不一样),这里其实cin>>ch语句没有执行,是因为cin出错了!

原文:C++输入cin详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值