zoukankan      html  css  js  c++  java
  • C++ 的getline问题

    在用c++的getline函数的时候碰到两个问题,总结如下:


    1.有时候写程序的时候我们会发现getline(cin,str);这样的语句是不会执行,而是直接跳过的,
    一般的解决方法是getline一句之前加cin.ignore()或者一句cin.get();,或者重复geiline

    解释:

    认真检查,在你写getline()函数之前,一定有输入过回车键,不论你输入的是字符,数字或是回车,空格符,getline()函数都接收
    而cin>>这种输入方式却是忽略回车的,如果你在getline()之前cin的一个数,回车被cin忽略了,却被getline函数接收了,感觉就是这条语句被跳过了 所以解决的办法是在getline函数之前再使用getline一次,将输入流里的回车符接收掉,后面就能正常输入了

    比如这段代码
    int a       
    cout<<"请输入a"<<endl;
    cin>>a;
    char *ch;   
    a=new char[a];   
    cout<<"请输入字符串ch"<<endl;
    cin.getline(ch,100);

    你会发现cin.getline(ch,100);并没有执行,因为cin>>a;后,你有一个回车键停留在缓冲区中了,当使用cin.getline(a,100);读到这个回车符,就认为输入结束了,所以,看起来没有起作用。
    应该是
    cin>>a;
    cin.get();   //加上这一句。


    2.while(getline(cin,line))怎么也跳不出循环

    在C++premer中,标准string类型第二小节就是“用getline读取整行文本”。书上给的程序如下:
    int main()
    {
        string line:
        while(getline(cin,line))
        cout<<line<<endl;
        return 0;
    }
    大家会发现运行时怎么也跳不出循环,

    让我们一起来分析一下while(getline(cin,line))语句

    注意这里默认回车符停止读入,按Ctrl+Z或键入EOF回车即可退出循环。

    在这个语句中,首先getline从标准输入设备上读入字符,然后返回给输入流cin,注意看原型,返回类型是istream,在这个语句中对应的即是cin了,所以while判断语句的真实判断对象是cin,也就是判断当前是否有有效的输入流。在这种情况下,我想只要你的电脑不中毒不发神经你的输入流怎么会没有效?所以这种情况下不管你怎么输入都跳不出循环,因为你的输入流有效,跳不出循环。
    然而有些同学误以为while判断语句的判断对象是line(也就是line是否为空),然后想通过直接回车(即输入一个空的line)跳出循环,却发现怎么也跳不出循环。这是因为你的回车只会终止getline()函数的读入操作。getline()函数终止后又进行while()判断(即判断输入流是否有效,你的输入流当然有效,满足条件),所以又运行getline()函数。就这样一次一次又一次的循环了~~~

  • 相关阅读:
    利用百度搜集子域名--爬虫技巧
    IoC模式
    SpringMVC @RequestBody接收Json对象字符串
    用eclipse创建动态web项目手动生成web.xml方法
    1.Java Spring MVC入门 安装
    获取所有注解
    带参数的方法获取注解
    利用反射调用注解
    java枚举类型
    java创建多线程
  • 原文地址:https://www.cnblogs.com/hhddcpp/p/4308587.html
Copyright © 2011-2022 走看看