getline()与get()——C++

Posted on 2021-09-01 20:51  foghorn  阅读(160)  评论(0编辑  收藏  举报

面向行的输入:getline()

getline()函数读取整行,它使用通过回车键输入的换行符来确定输入结尾。要调用这种方法,可以使用cin.getline()。该函数有两个参数。第一个参数是用来存储输入行的数组的名称,第二个参数时要读取的字符数。如果这个参数为20,则函数最对读取19个字符,余下的空间用于存储自动在结尾处添加的空字符。getline()成员函数在读取指定数目的字符或遇到换行符时停止读取。

案例

#include <iostream>

int main() {
    using namespace std;
    const int Arsize = 20;
    char name[Arsize];
    char dessert[Arsize];

    cout << "Enter your name: \n";
    cin.getline(name, Arsize);
    cout << "Enter your favorite dessert: \n";
    cin.getline(dessert, Arsize);
    cout << "I have some delicious " << dessert;
    cout << "for you, " << name << ".\n";
}

输出

Enter your name:
Dirk Hammernose
Enter your favorite dessert:
Radish Torte
I have some delicious Radish Torte for you, Dirk Hammernose.

该程序可以读入完整的姓名以及用户喜欢的甜点。getline()函数每次读取一行。它通过换行符来确定行尾,但是不保存换行符。在存储字符串时,它用空字符来替换换行符。

面向行的输入:get()

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

cin.get(name, Arsize);
cin.get(dessert, Arsize);

由于第一次调用后,换行符将留在输入队列中,因此第二次调用时看到的第一个字符便是换行符。因此get()认为已经达到行尾,而没有发现任何可读取的内容。此时需要在两次调用get()的中间再调用一次不带参数的get()函数。

cin.get(name, Arsize);
cin.get();
cin.get(dessert, Arsize);

综合

#include <iostream>
#include <string>

using namespace std;

int main ()
{
    cout << "What year was your house build?\n";
    int year;
    cin >> year;
    cout << "What is its street address?\n";
    char address[80];
    cin.getline(address, 80);
    cout << "Year built: " << year << endl;
    cout << "Address: " << address << endl;
    cout << "Done!\n";
    return 0;
}

输出
What year was your house build?
1966
What is its street address?
Year built: 1966
Address:
Done

从上面的输出可以看出,当我们输入 1966 时程序就自动往下执行并结束了,根本没有机会输入 street address。这是因为输入 1966,再按回车键时,回车键会留在缓冲区中,当执行 cin.getline(address, 80) 时首先会读入这个回车,getline()函数读入回车时,会认为一行输入结束了。
解决的办法是在 cin.getline(address, 80) 前面加一行 cin.get();

Copyright © 2024 foghorn
Powered by .NET 9.0 on Kubernetes