• c++面向行的输入getline()和get()


    来源:c++ primer plus

    在c++里当我们输入一个字符串时习惯用cin,但是cin只能读取一段不含空格的字符串,如果我们需要读取一段包含空格的字符串时,就需要用到getline()或get()。下面介绍getline()和get(),这两个都是读取到换行符结束。

    1.getline():

    假设现在我们要输入一个名字,保存在name数组里:

    #include<iostream>
    using namespace std;
    int main()
    {
      char name[10];
      cin.getline(name,10);
      cout<<name<<endl;
      return 0;
    }
    //第一次输入:123456    第一次输出:123456
    //第二次输入:1234567890 第二次输出:123456789

    调用方式是cin.getline(),里面有两个参数,分别是数组名和数组长度,在这里要注意的是如果长度是10,那么最多只会读取9个字符,因为还有一个位置要留给空字符'',如果只输入5个,那么剩余的都会用空字符来补满。对于getline(),它一直读取到遇到换行符或到达指定数目字符时结束,然后换行符会被丢弃,不留在输入队列里(这是接下来它和get()的细微区别)。

    getline()也可以这样用:

    #include<iostream>
    using namespace std;
    int main()
    {
        char name1[10],name2[10];
        cin.getline(name1,10).getline(name2,10);
      //第一次调用返回一个cin对象,然后这个对象再调用getline() cout
    <<name1<<' '<<name2<<endl; return 0; } /*输入: 123 456 输出:123 456 */

    2.get():

    get()和getline()很像,也是两个参数,但是get()读取到换行符停止时,换行符会留在输入队列里,下一次读取时就会再次读取到换行符,导致读取为空。

    例如:

    #include<iostream>
    using namespace std;
    int main()
    {
        char name1[10],name2[10];
        cin.get(name1,10);
        cin.get(name2,10);
        cout<<name1<<' '<<name2<<endl;
        return 0;
    }
    /*输入:123
    输出:123 */

    在这里我是想输入123再输入456的,但是我没机会了,因为输入123时遇到换行符然后停止,第二次调用时这个换行符还在输入队列里,程序就会再次停止,后面就读取不到内容了。

    当cin.get()里面没用参数时,它会吸取一个字符,包括换行符,所以我们可以这样:

    #include<iostream>
    using namespace std;
    int main()
    {
        char name1[10],name2[10];
        cin.get(name1,10);
        cin.get();
        cin.get(name2,10);
        cout<<name1<<' '<<name2<<endl;
        return 0;
    }
    /*输入:
    123
    456
    输出:
    123 456  
    */

    也可以这样写:

    #include<iostream>
    using namespace std;
    int main()
    {
        char name1[10],name2[10];
        cin.get(name1,10).get();
        cin.get(name2,10);
        cout<<name1<<' '<<name2<<endl;
        return 0;
    }
    /*输入:
    123
    456
    输出:
    123 456  
    */

     空行和超出分配空间都会导致出错,应该尽量避免。

    还有就是当我们在实际运用中可能要数字和字符串混合输入,这个时候容易出错,举一个书上的例子:

    #include<iostream>
    using namespace std;
    int main()
    {
        int year;
        char address[20];
        cin>>year;
        cin.getline(address,20);
        cout<<year<<endl;
        cout<<address<<endl;
        return 0;
    }
    /*
    输入输出: 
    2018
    2018
    
    */

    我们输入了年份,这个时候换行符还在输入队列里,然后调用getline()时遇到换行符,直接结束读取。。。,这里可以用cin.get()来吸收换行符。

    差不多就这么多吧。

  • 相关阅读:
    Fluent NHibernate之旅
    IOC之Unity
    使用AutoMapper实现Dto和Model之间自由转换
    javamail邮件发送
    webservice整合spring cxf
    spring 集成mongo配置
    mongodb安装 win7版
    freemarker之list和map
    servlet生命周期
    ArrayList和LinkedList和Vector源码分析
  • 原文地址:https://www.cnblogs.com/6262369sss/p/9385839.html
Copyright © 2020-2023  润新知