空格不能用在字符串中? C ++

时间:2011-02-14 12:40:22

标签: c++ string cin

基本上我正在试验多态性。我有2个对象,一个客户和一个员工。客户有姓名和投诉。员工有姓名和工资。

在循环中,我接受这些参数并创建一个新的Person来添加到数组中。

但这是我的问题:如果我在字符串中放置任何空格,那么循环就会结束。

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 个答案:

答案 0 :(得分:8)

  1. 输入运算符

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

    只有 读取输入到下一个空格字符 。 (这就是Jerry Schwartz 25年前发明IO流时指定的方式。)如果你需要阅读整个,那么

    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 :(得分:1)

首先我认为sizeof需要在对象周围加上括号。(见下面的评论)

第二个cin在输入时忽略空格。所以“何塞”变成了“何塞”。这可能是你遇到的问题。

答案 2 :(得分:1)

@sbi已经回答了你的主要问题。但是还有一些你可能需要注意的事情。

  1. 删除后会持有指针,这可能会导致以后出现问题。
  2. 您应该使用_getch()cin.get()代替system("PAUSE")。使用系统调用来保持命令窗口打开是不理想的。