getline 的替代品

Alternatives of getline

#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; 已在其之前执行,因此被跳过。 我尝试在 getline() 之前添加 cin.ignore(),但它要么要求我在输入之前按回车键,要么跳过第一个输入的第一个字符。

但是,如果我在每个 cin >> value; 块结束后添加 cin.ignore(),它会起作用。

所以我突然要到处加上cin.ignore()因为一个getline()? 或者 getline() 是否有其他方法可以将空格作为输入?

不幸的是,行为完全符合规范。 std::getline 按预期工作。

您需要阅读有关格式化输入和未格式化输入的内容,以了解为什么按原样实现它。

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

  • 在格式化输入后使用 ignore。不幸的是,在每次格式化输入后
  • 在您的输入语句中附加一个 get,例如 (cin >> pageCount).get();。同样,不幸的是在每次格式化输入后
  • std::getline中使用std::ws操纵器。喜欢:getline(cin >> ws, title);。这将吃掉 潜在的 前导空格,包括换行符。

请参阅文档 here

它还有一个额外的好处,如果用户在标题前输入不必要的空格,这些空格将被忽略。示例:输入:" This is the title" 将读取 "This is the title",没有前导空格。

所以,可以做的是:使用

getline(cin >> ws, title);

它会起作用。

#include <iomanip>