Получение нулевого вывода как >>, так и getline, даже если я использую строковые пробелы - PullRequest
1 голос
/ 01 апреля 2020

Я пытаюсь добавить переменные по пользовательскому вводу, используя >> или getline, но он дает нулевые значения для них обоих. Как мы знаем, getline не игнорирует начальные пробельные символы, поэтому я использую строковые пробелы, такие как employeeName=" "; string designation=" ";. Может ли кто-нибудь помочь мне для получения правильного вывода

class Employee{
  public:
  int employeeId,salary;
  string employeeName=" ";
  string designation=" ";
  void getEmployee(){
    cin>>employeeId;
    getline(cin,employeeName);
    getline(cin,designation);
    cin>>salary;
  }
  void ShowEmployee(){
    cout<<"Employee Id="<<employeeId<<"\n";
    cout<<"Employee Name="<<employeeName<<"\n";
    cout<<"Designation="<<designation<<"\n";
    cout<<"Salary="<<salary<<"\n";
  }
};
int main() {
  Employee ob;
  ob.getEmployee();
  ob.ShowEmployee();
}

enter image description here Может кто-нибудь помочь мне:)

Ответы [ 3 ]

1 голос
/ 01 апреля 2020

Вы никогда не вызываете функции-члены getEmployee. Поскольку ваш объект Employee создан в стеке, а employeeId и salary не инициализированы, они содержат внутри себя значения мусора.

В функции-члене ShowEmployee вы выводите только salary значение переменной, поэтому я предполагаю, что это не совсем тот код, который вы сами компилируете и тестируете.

Что касается ваших соображений, почему вы используете getline, я не Если это вообще не понятно, строка, переданная в качестве второго аргумента, будет перезаписана, поэтому все, что было в нем до потери вызова. Но если вы хотите смешивать вызовы operator>> и getline в одном и том же потоке, как вы, вам нужно использовать ignore, так как operator>> не извлечет '\n' из потока , который будет прочитан getline.

1 голос
/ 03 апреля 2020
getline(cin,employeeName);
getline(cin,designation);

В приведенном выше коде вы перезаписываете строку. Если вы хотите смешать пользовательский ввод нескольких типов данных, попробуйте использовать cin.ignore; перед вашим первым std :: getline (...).

1 голос
/ 01 апреля 2020

Но вы не вызываете getEmployee в вашем примере. Вы забыли?

Вы также можете попробовать конструктор, передав ему std :: istream, например

Employee(std::istream& in) {
  in >> this->employeeId;
  in >> this->salary;
  ....
}
...