zoukankan      html  css  js  c++  java
  • [C++] C++ 对cin类中的浅 解析。希望对大家有帮助

    cin()类的所有输入函数  她的意思是说
    输入的意思是从缓冲区读入字符这个动作
    它发生的条件就是按下回车,cin()从缓冲区读入一个字符
    但读这个动作是按下ENTER才发生的

    C++ 中 iostream 中的类cin 面向行的类成员函数 : getline() 和get()这两个函数都是读取一行的输入,直到到达换行符结束。 
    getline()将丢弃换行符,用空字符替代,而get()将换行符保留在输入序列中。

    get.line()函数和get()函数都是面向数组的输入 
    cin.getline(数组名,数组大小)但是最多输入数组大小参数的减一个字符,最后一个字符用来添加空字符 ‘’。
    getline()既然是面向行输入所以 即使是 空格也被读取到数组中 不像cin()只是读取一个一个单词 遇到空格 换行……都会结束输入

    不论是getline还是get  其实参数的数组名其实就是都是 。。地址

    main()
    {
      const int size = 20;
      char name[size];
      char dress[size];

      cout <<"输入name ";
      cin.getline(name,size);
      cout <<"输入 dress ";
      cin.getline(dress,size);
       
      cout<<"name : " <<name <<endl <<"dress : "<<dress <<endl;


    }
    ----------------------------

    cin.get(数组名,数组大小)  由于不丢弃换行符 所以get函数连续两次调用的时候 会把上一次调用get函数的输入的换行符 首相读入到 输入队列中 从而使输入终止。
    main()
    {
      const int size = 20;
      char name[size];
      char dress[size];

      cout <<"输入name ";
      cin.get(name,size);
      cout <<"输入 dress ";
      cin.get(dress,size);
       
      cout<<"name : " <<name <<endl <<"dress : "<<dress <<endl;
    }

    输入name
    li
    输入 dress
    name : li
    dress :
    程序会出错
    将不能输入dress

    -------
    但是对于get还有另一种变体  使用不带任何参数的cin.get
    cin.get(name,size);
    cin.get();
    cin.get(dress,size);

    main()
    {
      const int size = 20;
      char name[size];
      char dress[size];

      cout <<"输入name ";
      cin.get(name,size);
      cin.get();               // 相当于用get()冲刷了上一次缓冲区中输入队列中的换行符。
      cout <<"输入 dress ";
      cin.get(dress,size);
       
      cout<<"name : " <<name <<endl <<"dress : "<<dress <<endl;
    }

    函数也可以这样调用

    cin.get(name,size).get();
    cin.get(dress,size)

    ---同理 cin.getline(name,size).getline(dress,size) 同样可以 这样将两行输入分别放到两个数组中。

    get()函数的特性使得 更有意义  用get函数可以判断 输入的结束是什么原因造成的 只需要查看数组中最后一个字符是否是换行符就可以知道 。。


    =====================
    当输入 数组和非数组时 即cin 函数 和cin.get() 同时调用的时候 
    main()
    {
      int year;
      char name[80];

      cout <<"输入年份 ";
       (cin >> year).get();
       cout << "输入姓名 ";
       cin.get(name,80);

       cout << "year: " << year <<" name: " << name <<endl;
               

    }

    cin函数输入结束后 将回车生成的换行符 留在了输入队列中 当cin.get()调用的时候同样会把换行符读取到输入队列中 所用可以用(cin >> year).get()  将换行符在缓冲区里冲刷掉
    在cin之后加一个get()相当于把上一次留在缓冲区的换行符用get()接受了 。所以下一次调用cin.get()就不影响了

    =========================

    cin() 函数的输入-----非数组-------------深入了解cin函数的输入模式


    main()
    {
      char ch; //    一次只能存储一个字符
      int count = 0;

      cout << "输入 ";
      cin >> ch;
      while(ch != '#')
      {
       cout <<"000" << ch;
       
       count ++;
       cin >> ch;
      
      }


      cout <<endl << "最后输出ch = " <<ch <<endl;

      

    }
    第一种输入方法:

    输入
    a
    000a
    b
    000b
    c
    000c
    d
    000d
    #

    最后输出ch = #
    4

    ==========输入一次执行一次循环。。因为回车 生成换行符,cin函数中换行符表示输入结束,故执行循环。而ch字符变量只能存储一个字符所以最好输出时‘#’

    -------------
    第二种输入方法: 

    输入
    abc d#
    000a
    000b
    000c
    000d

    最后输出ch = #
    4

    这种是先全部输入完毕包括‘#’,并且有空格(只用在数组中空格表结束数组的存储,所以空格并没有使输入结束 并且忽略了空格,包括换行符,这也是cin函数的特性);当把字符都输入完后 回车结束cin函数的输入    进入循环 。。循环使实际并没有到 ch变量存储的数据哪里读取字符 ,而是到输入队列中去读取的字符 从第一次输入的字符开始读取  一次只读取一个字符 当遇到‘#’时结束循环 这才有了第二种输入的结果。 其中遇到的空 已经被cin函数忽略 换句话说 已经在cin输入队列中删除或不存在了 。。。。

    cin 函数进行输入时 遇到空格 换行符 等作为结束边界  cin在获取 字符串数组的输入时 遇到空格则结束存储 但仍可以继续输入,只不过输入被放在缓冲区中
    ----------------


    #include<string>  // 必须用string 类
    main()
    {
    int a = 0;
    string ch;
    cout <<"输入单词 ";
    while(cin >>ch && ch != "done")
       a++;

    cout << "共输入了 :" << a <<"个单词 ";


    }

    输入单词
    abc def opq done
    共输入了 :3个单词
    ----------------------
    此程序 也是在循环条件中  通过在输入队列中查找 符合条件的“done”。

    通过cin输入的内容,只用在用户按下回车键后 出入的内容才会被发送给程序。发送时会将整个字符序列发送给程序,当程序会按照程序的 语句来判断读取的内容。。。


    -------------===========cin.get(字符变量)==========重点~!!!===============

    要想输出一段 内容 包括空格 用cin.getline()和cin.get() 前提 参数必须是 数组。。。。。。。
    cin类中另一个函数参数版本 cin.get(字符变量) 即可完成 不用使用复杂的数组

    main()
    {
      char ch;
      int num = 0;

      cout <<"输入字符串 ";
           
      cin.get(ch);


      while(ch != '#')
      {
            cout << ch;
            num++;
            cin.get(ch); // 意思是从缓冲区读入一个字符,放到ch中,相当于给 ch又赋了一次值
      
                                          
      }
      cout <<endl <<num << "个字符"<<endl;
      cout <<"此时ch 变量中存储的数据是 :" << ch <<endl;
      

    }


    输入字符串
    abc def opq#

    abc def opq
    11个字符
    此时ch 变量中存储的数据是 :#
    -----------

    #include<iostream>
    using namespace std;
    main()
    {
      char ch;
      int num = 0;

      cout <<"输入字符串 ";

      cin.get(ch);
      cout << ch << endl;//这样加一句然后分析下
      while(ch != '#')
      {
      cout << ch;
      num++;
      cin.get(ch); // 从缓冲区读入一个字符  //意思是从缓冲区读入一个字符,放到ch中,相当于给 ch又赋了一次值
      }
    cout <<endl <<num << "个字符" <<endl;
    }
    /*
    这个输入的意思是从缓冲区读入字符这个动作
    它发生的条件就是按下ENTER
    getch()从缓冲区读入一个字符
    但读这个动作是按下ENTER才发生的*/

    看一看出  ch是字符变量 只能存储一个字符而已 但是在cin函数的缓冲区中却存放着输入队列中的一系列字符串(包括空格) ,ch !=‘#’这个判断条件是从输入队列中找的数据,

    ==============

    ( 数组中!)  C和C++ 的 scanf() 和 cin() 函数 读取字符串时候 都是 读取一个单词,即使用 空白 、空格、制表符、和换行符来确定字符串的边界

    /* #include<iostream>

    main()
    {
      using namespace std;
      char name[100];
      cout << "输入字符串" << endl;
      cin >> name;
      int a = 0;
      while(name[a] != '')
      {
              cout << name[a];
              a ++ ;
      }
    }

    #include <stdio.h>

    main()
    {
    char name[100];
    printf("输入字符串 ");
    scanf("%s",name);
    printf("字符串是: %s ",name);

    }
                                                                                                                      
  • 相关阅读:
    【Java学习】向上和向下转型
    【Java学习】java抽象类的作用
    【Java学习】追踪
    【Java学习】@Override 解释
    【Java学习】Java 中带包(创建及引用)的类的编译与调试
    【Java学习】相关基础算法
    【Java学习】import和import static的区别
    【testNG学习】testng.xml文件
    Reshape the Matrix
    Distribute Candies
  • 原文地址:https://www.cnblogs.com/baiyang201810/p/9750821.html
Copyright © 2011-2022 走看看