Функция сравнения класса string не работает должным образом - PullRequest
0 голосов
/ 12 апреля 2020

Я хочу искать профессоров по их именам. Поэтому я должен сравнить имя, которое я ввожу, с именем профессора. Я попытался отладить, что происходит, это не входит в оператор if (сравнивать). И я не могу понять, почему. Это довольно большой код, поэтому я просто включаю его часть. "профессора" - это вектор типа "Профессор", который есть класс.

        void RecruitProfessor()
        {
            Professor prof = Professor();

            string college,name,role,subject;
            cout<<"Enter the College Name: ";
            fflush(stdin);
            getline(cin, college);
            cout<<"Enter the Professor Name: ";
            getline(cin, name);
            fflush(stdin);
            cout<<"Enter the Professor Role: ";
            getline(cin, role);
            fflush(stdin);
            cout<<"Enter the Professor Subject: ";
            getline(cin, subject);
            fflush(stdin);


            prof.setCollegeName(college);
            prof.setProfessorName(name);
            prof.setProfessorRole(role);
            prof.setProfessorSubject(subject);
            professors.push_back(prof);
        }

        void DisplayProfessorInfo()
        {
            bool returnToMainMenu = false;
            while(!returnToMainMenu)
            {
                cout<<"1. Fetch the details of all the professors \n";
                cout<<"2. Fetch the details of professors by Name \n";
                cout<<"3. Fetch the details of professors by Role \n";
                cout<<"4. Fetch the details of professors by Subject \n";
                cout<<"5. Fetch the details of professors by Colleges \n";
                cout<<"6. Return to main menu \n";

                Professor prof = Professor();
                int choice;
                cout<<"Please enter your choice:\n";
                choice = getInt();
                switch(choice)
                {
                    case 1:
                    {
                        if(professors.size()==0)
                        {
                            cout<<"\n\nNo professors found!\n\n";
                            returnToMainMenu = true;
                        }
                        else
                        {
                            for(Professor i:professors)
                            {
                                //cout << i.getProfessorCollege() << endl;
                                cout<<"Professor College: " + i.getProfessorCollege() + "\n";
                                cout<<"Professor Name: " + i.getProfessorName() + "\n";
                                cout<<"Professor Role: " + i.getProfessorRole() + "\n";
                                cout<<"Professor Subject: " + i.getProfessorSubject() + "\n";
                                cout<<"\n\n";
                            }
                        }
                        break;
                    }
                    case 2:
                    {
                        string name;
                        if(professors.size()==0)
                        {
                            cout<<"\n\nNo professors sfound!\n\n";
                            returnToMainMenu = true;
                        }
                        else
                        {
                            getline(cin, name);
                            fflush(stdin);
                            cin.ignore(numeric_limits<streamsize>::max(), '\n');
                            //cout<<name;
                            for(Professor i:professors)
                            {
                                if((name.compare(i.getProfessorName()))==0)
                                {
                                    cout<<"Professor College: " + i.getProfessorCollege() + "\n";
                                    cout<<"Professor Name: " + i.getProfessorName() + "\n";
                                    cout<<"Professor Role: " + i.getProfessorRole() + "\n";
                                    cout<<"Professor Subject: " + i.getProfessorSubject() + "\n";
                                    cout<<"\n\n";
                                }
                                else{continue;}
                            }
                        }
                        break;
                    }

Ответы [ 2 ]

0 голосов
/ 12 апреля 2020

Некоторые возможные части ошибки вместе с ненужным кодом:

  • Вместо choice = getInt();, просто используйте cin>>choice;
  • Нет необходимости использовать такой код:
getline(cin, name);
fflush(stdin);
cin.ignore(numeric_limits<streamsize>::max(), '\n');

, когда вы даже не берете другую строку или строку ввода после использования getline() выше. (следующие вызовы cout)

Вместо этого используйте cin>>name. Первоначально ваш код с этими строками не работал, когда я попробовал его на онлайн-компиляторе. Но это работает сейчас, после удаления тех, кто просто std::cin.

Я сделал небольшой воспроизводимый пример на основе вашего кода, и он отлично работает:

#include <iostream>
#include <vector>

class Professor 
{   public:
    std::string name;
    std::string getName()
    { return name; }
};

int main() 
{ std::vector<Professor> professors;
  Professor a,b,c;
  a.name = "eerorika"; b.name = "S.S.Anne" ; c.name = "walnut";
  professors.push_back(a);
  professors.push_back(b);
  professors.push_back(c);
  int choice; 
  std::cin>>choice;
  switch(choice)
  {
    case 1:
    {  std::string profname;
       std::cin>>profname;
       if(professors.size()!=0)
       for(Professor i:professors)
         if(profname.compare(i.getName())==0)
           std::cout<<"Professor name = "<<i.getName()<<"\n";
        break;   
    }
    case 2:
    {  std::cout<<"Mystical";
       break;
    }
  }
  return 0;
}

0 голосов
/ 12 апреля 2020

(извините, я не могу комментировать)

Ваше сравнение имен выглядит нормально, поэтому, возможно, вы могли бы добавить:

cout << "'" << name << "' vs '" << i.name << "' is " << name.compare(i.name) << endl;

В противном случае поможет более полный пример меньшего размера (например, отбросьте, как вы заполняете из stdin и просто используйте фиксированные значения, сбросьте l oop, сбросьте переключатель и т. д. c). Проверяйте после каждого упрощения, таким образом, вы уже можете найти причину проблемы.

...