浅析C++中的三种输入法

 

        对于一个刚刚接触C++的学者来说,C++的强大,令你叹服,也令你头痛----意味着我们需要掌握的知识是无穷无尽的!所以在学习的过程中需要掌握一定的学习方法,亦需要时刻地做一些笔记以提醒自己,又或者给一些初涉者提供一定的帮助!一下是本人在学习C++ Primer Plues时,对于C++三种输入法的一些笔记!

        要想深入的学习C++的输入法,首先要对其输入法的流程有一定的了解,输入法是以流的形式输入的,即是说:I/O设备对于从键盘中的输入首先将其输入一个缓冲区中,形成一个输入队列,当你的程序中的语言对其进行响应的时候,再从其输入队列中一个一个或者一行一行地提取其字符流,要搞明白下面的输入过程,必须要对这个过程有一定的了解,熟悉其工作的原理!

1.cin的输入,首先来看看下面一个程序:

    #include ”iostream“

   #include " string"

   const int size = 20;

   int main ()

   {

       using namespace std;

       char a[size];

       cout << "Enter a string: ";

       cin >>char;

       cout << "The string is: " << char << endl;

       return 0; 

    }

    上面是一个简单的cin输入应用,当我们输入“aaaa”的时候,结果好显然是输入了”aaaa“,但当我们输入的是”aa aa“,它输出的却是”aa“,而为什么不是”aaaa“呢?!这是因为cin在获取字符数组的时候只读取一个一个的单词,当cin输入在遇到空白、空格、制表符和换行符的时候来定字符串的界,上面的输入”aa aa“,当读取到前面两个的时候,第三个是一个空格,所以cin就停止了对输入队列中的字符流的读取,所以只输出”aa“!

2.cin.get()和cin.geiline()的输入的区别

   对于上面的输入问题,可以通过cin.get()和cin.getline()的输入方法来解决,这两个都是面向行输入的方法,对上面的程序进行修改:

    #include ”iostream“

   #include " string"

   const int size = 20;

   int main ()

   {

       using namespace std;

       char a[size];

       cout << "Enter a string: ";

       cin.get(a, size);//or cin.getline (a, 20);

       cout << "The string is: " << char << endl;

       return 0; 

    }

    这两种方法都是面向行的输入法,有两个参数,第一个参数是用来存储输入行的数组名,第二个参数是要读取的字符数,当它们遇到通过回车键有或者到达字符流的要求字数的时候,就会停止从输入队列中读取字符流!所以这两种输入法满足了条件,从而输出的结果为”aa aa“了!

    讲到这里,先对这三种方法做个归纳:cin只是从输入队列中一个一个的读取字符流,而cin.get()和cin.getline()是面向行的输入,在输入队列中是一行一行的读取!紧记两点区别!

     再来看看下面一个程序:

     #include "iostream"

     const int size = 20;

    int main ()

    {

           using namespace std;

           char name[size];

           char  sex[10];

           cout << 'Please enter your name: ';

            cin >> name;

            cout << "Please enter your sex: ";

            cin >> sex;

            cout << "your name is: " << name << endl;

            cout << "your sex is: " << sex << endl;

             return 0;

     }

     当你运行上面的程序的时候,结果却不是你想象中的那样,输出如下:

      Please enter your name: a a a;

      Please enter your sex:

      your name is: a

      your sex is:

      ........

     可以发现当你的一个输入的字符中没有存在着空格的时候,这个程序输出的还是和你想象中的一样,但当含有空格的时候,输出就不同了!这原因出于哪呢?!

     这是因为当完成第一个输入的时候,其空格字符保留在了输入队列中,当第二个输入想读取的时候,读取到的就是空格字符,它就默认到了结尾,没有内容可以输入了,所以第二个输入什么也没有读取到!

     当我将cin换回cin.getline ()和cin.get ()的时候,你就会发现cin.get ()和cin的结果一样,但cin.getline ()却成功了,这又是什么原因!?这是因为cin和cin.get()的输入方法是将换行符保留在输入队列中的,而cin.getline ()没有保留其换行符在输入队列中,如果不借助帮助,cin和cin.get()就会很难跨过该换行符,区别就在这里!这一点也需要紧记!

     有什么办法解决这个问题呢?!

     你可以通过这个输入方法来更改程序:cin.get().get()  这是因为cin.get () 将会返回一个cin的对象,所以这就相当于执行了两次cin.get()了,又或者你可以在cin和cin.get()的方法之后再加上一个cin.get(),即是:cin >> name; cin.get ();  或者 cin.get(a, 20); cin.get (); 。这个办法行得通是因为cin.get()可读取下一个字符(包括换行符),因此可以用它来处理换行符,为读取下一个输入做好准备!

其正确的程序如下:

#include "iostream"

     const int size = 20;

    int main ()

    {

           using namespace std;

           char name[size];

           char  sex[10];

           cout << 'Please enter your name: ';

            cin >> name;

             cin.get();

            cout << "Please enter your sex: ";

            cin >> sex;

            cout << "your name is: " << name << endl;

            cout << "your sex is: " << sex << endl;

             return 0;

     }

       以上只是个人的一些肤浅的见解,对学习过程的一种归纳,希望各位可以能够多多指教!

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值