Getline的替代品

曼尼斯·库玛(Manish Kumar)
#include <iostream>
using namespace std;

class publication {
private:
  string title;
  float price;

public:
  publication() {
    this->title = "";
    this->price = 0.0;
  }

  void getdata() {
    cout << "Enter Title: ";
    getline(cin, title);
    cout << "Enter price: ";
    cin >> this->price;
  }

  void putdata() {
    cout << "Title: " << title << endl;
    cout << "Price: " << price << endl;
  }
};

class book : public publication {
private:
  int pageCount;

public:
  book() { this->pageCount = 0; }

  void getdata() {
    publication::getdata();
    cout << "Enter page count: ";
    cin >> pageCount;
  }

  void putdata() {
    publication::putdata();
    cout << "Page Count: " << pageCount << " pages\n";
  }
};

class tape : public publication {
private:
  float playingTime;

public:
  tape() { this->playingTime = 0; }

  void getdata() {
    publication::getdata();
    cout << "Enter playing time: ";
    cin >> playingTime;
  }

  void putdata() {
    publication::putdata();
    cout << "Playing Time: " << playingTime << " mins\n";
  }
};

int main() {
  book b;
  tape t;
  b.getdata();
  t.getdata();
  b.putdata();
  t.putdata();
  return 0;
}

第一次getline()运行完美,但是第二次调用,由于cin >> value;之前已经执行过一些,因此被跳过了。我尝试添加一个cin.ignore()before getline(),但是它要么要求我在输入之前按Enter键,要么跳过第一个输入的第一个字符。

但是,如果我cin.ignore()在每个cin >> value;的末尾添加,它将起作用。

因此,我必须cin.ignore()因为一个而突然在所有地方添加getline()还是有其他选择getline()将空格作为输入?

阿明·蒙蒂尼(Armin Montigny)

不幸的是,这种行为完全符合规范。std::getline可以正常工作。

您需要阅读有关格式化输入和未格式化输入的信息,以了解为何按原样实现它。

但是,您正在寻找解决方案。基本上有3:

  • ignore在格式化输入后使用不幸的是,在每次格式化输入之后
  • 将一个附加get到您的输入语句,例如(cin >> pageCount).get();同样,不幸的是,每次格式化输入后
  • 在中使用std::ws操纵器std::getline像:getline(cin >> ws, title);这将吞噬包括换行符在内的潜在的领先空白。

请在此处查看文档

它具有另一个优点,如果用户在标题前面输入了不必要的空格,则这些空格将被忽略。示例:输入:" This is the title"将读取"This is the title",前导空格。

因此,可以做的是:使用

getline(cin >> ws, title);

它会工作。

#include <iomanip>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章