getline 的替代品

Man*_*mar 6 c++ getline c++11

#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;
}
Run Code Online (Sandbox Code Playgroud)

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

但是,如果我cin.ignore()在每个cin >> value;块的末尾添加,它就可以工作。

所以我必须cin.ignore()因为一个而突然到处添加getline()?或者有没有其他选择getline()可以将空格作为输入?

Arm*_*gny 6

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

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

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

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

请参阅此处的文档。

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

那么,可以做的是:使用

getline(cin >> ws, title);
Run Code Online (Sandbox Code Playgroud)

它会起作用。

#include <iomanip>