Пробелы не могут быть использованы в строке? C ++ - PullRequest
3 голосов
/ 14 февраля 2011

В основном я экспериментирую с полиморфизмом.У меня есть 2 объекта, клиент и сотрудник.у клиента есть имя и жалоба.У сотрудника есть имя и зарплата.

В цикле я беру эти параметры и создаю новую персону для добавления в массив.

Но вот моя проблема: если я ставлю какие-либопробелы в строке, цикл заканчивается до конца.

Person *persons[10];

for (int i = 0; i < sizeof persons;i++)
{
    cout<<"Please type 1 for customer or 2 for Employee"<<endl;
    int q;
    cin>>q;
    string name;
    int salary;
    string complaint;


    if (q == 1)
    {
        cout<<"What is your name?"<<endl;
        cin>>name;
        cout<<"What is your complaint"<<endl;
        cin>>complaint;

        personPtr = new Customer(name,complaint);
        cout<<"Created customer"<<endl<<endl;
        persons[i] = personPtr;
        cout<< "added to array"<<endl<<endl;
    }
    else if(q==2)
    {
        cout<<"What is your name?"<<endl;
        cin>>name;
        cout<<"What is your salary"<<endl;
        cin>>salary;
        personPtr = new Employee(name,salary);
        persons[i] = personPtr;
    }
    else
    {
        cout<<"Sorry but i could not understand your input. Please try again"<<endl;
        i--;
        cin>>q;
    }
}
delete personPtr;
system("PAUSE");

Есть ли какой-нибудь особый способ включения строк?

Вот классы клиентов и сотрудников для справки.

class Person
{
public:
Person(const string n)
{name = n;}; // initialise the name
virtual void printName();
protected:
string name;
};


class Customer:public Person
{
public:
string complaint;

Customer(string name, string cm)
    :Person(name)
{       
    complaint=cm;
}
virtual void printName();
};

class Employee:public Person
{
public:
int salary;

Employee(string name,int sl)
    :Person(name)
{       
    salary = sl;
}
virtual void printName();
};

Ответы [ 3 ]

8 голосов
/ 14 февраля 2011
  1. Оператор ввода

    std::istream& operator>>(std::istream& is, std::string&)
    

    только когда-либо считывает ввод до следующего пробельного символа .(Это было именно так, как было указано, когда Джерри Шварц изобрел потоки ввода-вывода 25 лет назад.) Если вам нужно прочитать целые строки , то

    std::istream& getline(std::istream&, std::string&, char='\n')
    

    - это то, что вам нужно использовать:

    std::string name;
    std::getline(std::cin, name);
    
  2. Ошибка ввода .Например, чтение int может завершиться неудачно, поскольку во входном буфере есть только нецифровые цифры.В случае сбоя потоковых операций в потоке будут установлены биты состояния.После сбоя поток не будет выполнять никаких дальнейших операций.Операнды >> останутся нетронутыми.
    Поэтому вам нужно проверить, успешно ли выполнялись ваши операции ввода , прежде чем использовать данные.Самый простой способ сделать это - проверить поток после операций ввода:

    if(!std::cin) {
      // input failed
    }
    
1 голос
/ 14 февраля 2011

@ sbi уже ответил на ваш главный вопрос.Но есть пара других вещей, на которые вы можете обратить внимание.

  1. Вы держите указатели после их удаления, что может вызвать проблемы позже.
  2. Вам следует использовать _getch() или cin.get() вместо system("PAUSE").Использование системных вызовов для сохранения окна командной строки не идеально.
1 голос
/ 14 февраля 2011

Сначала я думаю, sizeof необходимо заключить скобки вокруг объекта. (см. Комментарий ниже)

Второй cin игнорирует пробелы при вводе.Таким образом, «Хосе» становится «Хосе».Это может быть вашей проблемой.

...