zoukankan      html  css  js  c++  java
  • cin.getline()与getline()

    ---出现问题--- 
    一个getline和cin.geline这两个函数的区别:
    这两个函数同时是存储一个句子,用getline函数时,当输入一个字符串时,要敲两下回车,这个语句才结束,而用cin.getline则不用:
    #include <iostream>
    #include <string>
    using namespace std;
    main ()
    {
             string name; 
             getline (cin, name);
             cout <<name<<endl;
    }
    //需要敲两次回车语句才结束
    //当我输入one sentence[ENTER]时,它并不运行cout这个语句,而是光标还在编绎窗口上闪动,要再按一下[ENTER]才会运行cout这个语句
    #include <iostream>
    #include <string>
    using namespace std;
    main ()
    {
             char name[100];
             cin.getline (name , 100);
             cout <<name<<endl;
    }
    //这个程序敲一次[ENTER]即可




    ---不同之处---
    1.istream& getline( istream& is, string& s, char delimiter = '/n' ); 2.cin.getline(string &,LENGTH,char delimiter = '/n' ); 是两个不同的函数; 一个是属于string; 一个是属于istream流; ---为什么导致前面出现的问题--- getline和cin.get实际上都是3个参数的(最后一个经常省略),我觉得这两个函数的结果应该是一样的,出现不同的结果的可能是函数参数写的不 完整导致的。因为第三个参数可以省略(系统会自动给出),所以我们不去注意它。我测试了一下,如果把参数补上,则2个函数的结果是一样的。具体如下(这里 我们把'z'作为结束字符): //程序1 #include <iostream> #include <string> using namespace std; main () { string name; getline (cin,name,'z'); cout <<name<<endl; } //程序2 #include <iostream> #include <string> using namespace std; main () { char name[100]; cin.getline (name , 100,'z'); cout <<name<<endl; } 下面是运行结果,其中前4行为输入内容,后5行为输入内容: jkljkl jkljkl jkljkl jkl jkljkl jkljkl jkljkljkl jkljkl jkljkljklz jkljkl jkljkl jkljkl jkl jkljkl jkljkl jkljkljkl jkljkl jkljkljkl Press any key to continue 可以看出,在我输入结束字符'z',之前,输入的字符、空格和回车全部都原样输出,两者并没有任何区别;
    这样一比较getline(cin,name)和带结束参数的这个函数似乎更为接近(等待系统再次输出一个回车之后结束输入,带参数的是等待输入结 束符z结束输入),这么说getline的默认结束符可能是回车,而正是第二个结束符结束了输入并输出;但是,问题是,那第一个回车怎么不结束输入呢?就 getline(cin,name,
    'z')来说,如果我们输入jklzjklz,那系统输出必然是jkl,怎么可能等第二个结束符呢!好我们测试一下, 到底哪个回车才是真正的结束符: 输入jkljkl[ENDTER]之后,不运行cout,只是光标换行了;然后输入abc[ENDTER] 输出为:jkljkl
    把abc换成别的也是一样的效果,这说明第一次回车的时候,输入就结束了!第二个回车完全是多余的! 实际上有很多人说这是vc的一个bug,也有人说不是,但是也说不上它到底有什么作用; 如果把getline的第二个回车理解为多余的话,那么这里的getline(cin,name)和cin.getline(name,
    100)在 功能上就一样了;
    另一点,getline()和cin.getline()其实并不只是可以输入一行,也可以输入一篇文章,只要设置恰当的结束符就可以了;我们平时 不带参数时就不能,因为默认的结束符是
    '/0'(注意并不是回车),当你回车的时候,系统认为你输入完毕,自动会在句尾加上'/0',然后结束; NOTE:原来这个问题在VC6.0上才会出现输入两次的情况,在vs2005中这种现象不会出现。
  • 相关阅读:
    udelay、mdelay、ndelay、msleep使用比较说明
    linux多线程驱动中调用udelay()对整个系统造成的影响(by liukun321咕唧咕唧)
    linux设备驱动那点事儿之平台设备理论篇
    misc_register、 register_chrdev 的区别总结
    platform_driver与file_operations两种方法开发led驱动
    rc522 ,pn544区别
    内核驱动中常见的miscdevice、platform_device、platform_driver
    file_operations结构2
    file_operations结构体解析 1
    android5.0问题
  • 原文地址:https://www.cnblogs.com/2014acm/p/3877811.html
Copyright © 2011-2022 走看看