美文网首页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函数的使用

    描述 在C++中,我们通常使用cin作为输入函数来读取用户键盘输入的数据,由于不能通过键盘来输入空字符,因此cin...

  • 12 B 文件输入输出

    cin.get();cin.getline();cin.putback(); cout.put(char);<< ...

  • Day_03 复合类型

    1.利用cin、cin.get()和cin.getline()输入字符串的区别iostream中的类cin提供了一...

  • C++中cin、cin.get()、cin.getline()、

    学C++的时候,这几个输入函数弄的有点迷糊;这里做个小结,为了自己复习,也希望对后来者能有所帮助,如果有差错的地方...

  • C++中cin、cin.get()、cin.getline()、

    1.cin>> 注意:>> 是会过滤掉不可见字符(如 空格 回车,TAB 等) cin>>noskipws>>in...

  • 3.3.3数组和C风格字符串

    get()函数和getline()函数 相同点 不同点 "cin.getline(school,50)" getl...

  • 第九章 内联函数

    简介:C++中预处理器宏存在的问题,在C++中如何用内联函数解决这些问题以及使用内联函数的方针和内联函数的工作机制...

  • 18/4 lambda表达式

    比较函数指针、函数符和lambda函数 cout_if() 在c++中对于接受函数指针或函数符的函数,可使用匿名函...

  • 第三章 C++中的C

    简介:提供在C++中使用C风格的背景知识 3.1 创建函数 在C++中,函数定义的参数列表中,可以使用未命名的参数...

  • C++中的指针和引用与Java中的引用区别

    C++的指针和Java中的引用比较像,在作为函数参数传递时,都可以在函数内部改变 ”外部“ 的值 C++的引用使用...

网友评论

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

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