ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2021-09-01 21:01:26  阅读:147  来源: 互联网

标签:Arsize 读取 get cin C++ 换行符 getline


面向行的输入: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();

标签:Arsize,读取,get,cin,C++,换行符,getline
来源: https://www.cnblogs.com/foghorn/p/15216382.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有