美文网首页c++学习笔记
C++中cin.getline和cin.get函数的使用

C++中cin.getline和cin.get函数的使用

作者: 檀香静雪 | 来源:发表于2020-07-12 18:12 被阅读0次

    描述

    在C++中,我们通常使用cin作为输入函数来读取用户键盘输入的数据,由于不能通过键盘来输入空字符,因此cin需要用别的方法来确定字符串结尾位置。cin使用空白、空格、制表符和换行符来确定字符串的结束位置,这意味着cin在读入数据的时候只能截取上述结束符前的数据,对于结束符后的数据讲不能读入程序中。我们来考一个cin读入字符串的实例。

    #include<iostream>
    int main(){
        using namespace std;
        char name[30];
        cout << "请输入您的姓名:";
        cin >> name;
        cout << "您的名字是:" << name << endl;
        return 0;
    }
    

    运行上面的程序,当我们输入woody allen时,程序会得到下面的结果:

    请输入您的姓名:woody allen
    您的名字是:woody
    

    我们发现cin函数读入的数据并不完整,在上述样例中输入的名字被空格键截断了,所以cin只读入了一个单词就结束了读入操作。再来考察一个类似实例看看输入缓冲区内发生了什么?

    #include<iostream>
    int main(){
        using namespace std;
        char name[30];
        char addr[50];
    
        cout << "请输入您的姓名:";
        cin >> name;
    
        cout << "请输入您的地址:";
        cin >> addr;
    
        cout << "您的名字是:" << name << endl;
        cout << "您的地址为:" << addr << endl;
        return 0;
    }
    

    运行上述程序,我们发现,还没对地址输入提示做出反应,程序就把他显示出来了。然后立即显示最后一行。运行结果如下所示:

    请输入您的姓名:woody allen
    请输入您的地址:您的名字是:woody
    您的地址为:allen
    

    解决

    面向行输入:getline()

    getline()函数读取输入的整行,它使用通过回车键输入的换行符来作为结束符。要调用这种方法可以使用cin.getline(),该函数有两个参数,第一个参数是用来存储输入行的数组名称,另一个参数是要读取的字符串长度,如果参数为30,则最多读取29各字符,最后一个用来存储在字符串末尾的空字符。
    例如,假设要使用cin.getline()将姓名读入到一个包含30各元素的name数组中,可使用下面这样的函数调用:

    cin.getline(name,30);
    

    这样就可以将一行读入到数组中————如果这一行不超过29个字符(getline()成员函数还可以接受第三个可选参数,在此不做讨论)。现在对上述样例进行修改如下:

    #include<iostream>
    int main(){
        using namespace std;
        char name[30];
        char addr[50];
    
        cout << "请输入您的姓名:";
        cin.getline(name,30);
    
        cout << "请输入您的地址:";
        cin.getline(addr,50);
    
        cout << "您的名字是:" << name << endl;
        cout << "您的地址为:" << addr << endl;
        return 0;
    }
    

    上述程序中将cin换成了cin.getline(),我们得到了正确的输入如下:

    请输入您的姓名:woody allen
    请输入您的地址:Guizhou China
    您的名字是:woody allen
    您的地址为:Guizhou China
    

    getline()函数每次读取一行,它通过回车键输入的换行符来确定行尾,但是不保存换行符。相反,在存储字符串时,它用空字符来替换换行符。

    面向行的输入get()

    另外还有一种方法。istream类有另一个名为get()的成员函数,该函数有几种变体,其中一种与getline()类似,他们接受相同的参数,解释参数的方式也相同,都读取到行尾。单get()不再读取并丢弃换行符,而是将其留在输入队列中,假设我们连续两次调用get()

    cin.get(name,arrSize);
    cin.get(addr,arrSize);
    

    运行上诉代码,我们会发现第二行代码并没有读入数据,原因是当第二行代码在读取数据时,把第一行读取的回车符当成了第二个字符串的结束标志,所以接下来的数据都没有读入,一个解决办法是将上诉代码改为:

    cin.get(name,arrSize);
    cin.get();
    cin.get(addr,arrSize);
    

    通过新增的cin.get();先读取上一行留下来的换行符,然后再读取下一个字符串。

    另一种使用get()的方法是将两个类成员函数拼接起来使用,如下代码所示:

    cin.get(name,addr).get();
    

    之所以这样做,是由于cin.get(name,addr)返回一个cin对象,该对象随后将被用来调用get()函数,同样,下面语句也能将输入的两行分别读到数组nameaddr中,其效果与两次调用cin.getline()相同:

    cin.getline(name,ArSize).getline(addr,ArSize);
    

    相关文章

      网友评论

        本文标题:C++中cin.getline和cin.get函数的使用

        本文链接:https://www.haomeiwen.com/subject/othncktx.html