zoukankan      html  css  js  c++  java
  • C++输入cin详解

    输入原理:

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

    #1:

    复制代码
    #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 (输出) 

    (输出-换行)

    【分析】之所以第一次输入完后直接程序就结束了,而不是进行第二次输入,是因为第一次多输入的数据还残留在缓存区中,第二次输入就直接从缓存区中提取而不会请求键盘输入,以下探讨几种常见的输入方式:

    . cin<<

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

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

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

    #2

    复制代码
    #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

    【分析】第一次读取字符串时遇到空格则停止了,将abcd读入str1,并舍弃了空格,将后面的字符串给了第二个字符串。这证明了cin读入数据遇到空格结束;并且丢弃空格符;缓冲区有残留数据,读入操作直接从缓冲区中取数据。

    二.cin.get(数组名,长度,结束符)

    其中结束符为可选参数,读入的字符个数最多为(长度-1)个,结束符规定结束字符串读取的字符,默认为ENTER

    若要读取字符,直接cin.get(char ch)或ch=cin.get()即可

    读取字符的情况:

    输入结束条件:Enter键

    对结束符处理:不丢弃缓冲区中的Enter

    cin.get() 与 cin.get(char ch)用于读取字符,他们的使用是相似的,

    即:ch=cin.get() 与 cin.get(ch)是等价的。

    #3

    复制代码
    #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[Enter]

    输出:

    a

    97 10

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

    测试二输入:

    a b[Enter]

    输出:

    a

    97 32

    【分析】显然第一个字符变量取的’a', 第二个变量取的是Space(ASCII值为32)。原因同上,没有丢弃Space字符。

    读取字符串的情况:

    输入结束条件:默认Enter键(因此可接受空格,Tab键),可在第三个参数上自定义结束符

    对结束符处理:丢弃缓冲区中的Enter

    #4

    复制代码
    #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

    【分析】第一次输入超长,字符串按长度取了"1234",而’5′仍残留在缓冲区中,所以第二次输入字符没有从键盘读入,而是直接取了’5′,所以打印的ASCII值是53(’5′的ASCII值)。

    测试二输入:

    12d45[Enter]

    输出:

    12

    d

    【分析】第二次输出为d,说明自定义结束符时不丢弃缓冲区中的结束符

    三.cin.getline()

    cin.getline(数组名,长度,结束符) 大体与 cin.get(数组名,长度,结束符)类似。

    区别在于:

    cin.get()当输入的字符串超长时,不会引起cin函数的错误,后面的cin操作会继续执行,只是直接从缓冲区中取数据。但是cin.getline()当输入超长时,会引起cin函数的错误,后面的cin操作将不再执行。

    #5

    复制代码
    #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[Enter]

    输出:

    1234

    -52

    【分析】与cin.get()的例子比较会发现,这里的ch并没有读取缓冲区中的5,而是返回了-52,这里其实cin>>ch语句没有执行,是因为cin出错了!cin的错误处理下次介绍。

  • 相关阅读:
    常用知识点集合
    LeetCode 66 Plus One
    LeetCode 88 Merge Sorted Array
    LeetCode 27 Remove Element
    LeetCode 26 Remove Duplicates from Sorted Array
    LeetCode 448 Find All Numbers Disappeared in an Array
    LeetCode 219 Contains Duplicate II
    LeetCode 118 Pascal's Triangle
    LeetCode 119 Pascal's Triangle II
    LeetCode 1 Two Sum
  • 原文地址:https://www.cnblogs.com/hnrainll/p/2617783.html
Copyright © 2011-2022 走看看