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

C++ 空格不能在字符串中使用?c++;,c++,string,cin,C++,String,Cin,基本上我是在试验多态性。我有两个对象,一个客户和一个员工。客户有名字和投诉。雇员有名字和薪水 在一个循环中,我接受这些参数并创建一个要添加到数组中的新人物 但这是我的问题:如果我在字符串中放入空格,循环将运行到底 Person *persons[10]; for (int i = 0; i < sizeof persons;i++) { cout<<"Please type 1 for customer or 2 for Employee"<<endl;

基本上我是在试验多态性。我有两个对象,一个客户和一个员工。客户有名字和投诉。雇员有名字和薪水

在一个循环中,我接受这些参数并创建一个要添加到数组中的新人物

但这是我的问题:如果我在字符串中放入空格,循环将运行到底

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");
  • 输入运算符

    std::istream& operator>>(std::istream& is, std::string&)
    
    只有读取输入直到下一个空白字符。(这正是25年前Jerry Schwartz发明IO streams时指定的方式。)如果你需要阅读整行文字,那么

    是您需要使用的:

    std::string name;
    std::getline(std::cin, name);
    
  • 输入可能会失败。例如,读取
    int
    可能会失败,因为输入缓冲区中只有非数字数字。如果流操作失败,将在流中设置状态位。失败后,流将不会执行任何进一步的操作。
    >
    的操作数将保持不变。
    因此,在使用数据之前,您需要检查输入操作是否成功。最简单的方法是在输入操作后检查流:

    if(!std::cin) {
      // input failed
    }
    
  • 首先,我认为
    sizeof
    需要在对象周围加括号。(见下文评论)


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

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

  • 删除指针后仍保留指针,这可能会导致以后出现问题
  • 您应该使用
    \u getch()
    cin.get()
    而不是
    系统(“暂停”)
    。使用系统调用保持命令窗口打开并不理想

  • 您是否尝试过在输入字符串周围加引号,听起来您的空格被解释为单独的arguments@Joe:如果使用
    operator>
    从控制台读取字符串,那就是胡说八道。该运算符不实现引号的处理。sizeof仅在与类型一起使用时才需要括号。例如sizeof(int)。对于表达式,语法是sizeof expr。因为如果expr是一个表达式(expr)也是一个表达式,那么sizeof(expr)就相当于sizeof expr。@Armen,谢谢,我不知道。数组中是否有sizeof的替代品?实际上,我被告知要在堆栈上使用它。从来没有真正知道我要进入什么。“泛音,因为这是C++,总是向量。我真的不明白你在堆栈上使用它是什么意思。在“堆栈溢出”上使用它。对不起,我漏了一个字。所以我需要让>>操作员超负荷工作。这比我现在做的还要先进。不过谢谢你的帮助。@OVERTONE:过了一段时间之后,我习惯于人们在回答问题之前掩盖问题的细节,但是提问者掩盖答案对我来说是新闻。我到底写了什么让你觉得你需要超载
    操作员>
    ?@泛音:不,你不需要。你误解了答案。@overtone,他的意思是使用
    getline
    简而言之,写
    getline(cin,name)
    。真的吗?那么,我该如何完全删除指针,或者更确切地说,删除指针所携带的数据呢?我想,系统(“暂停”)正是我所想的方式。就像我以前用/n代替endl一样。但是谢谢你的建议实际上,你有一个内存泄漏(你分配了10个对象,但是只有最后一个会被删除)。避免这种情况的最好方法是使用类似于
    shared\u ptr
    scoped\u ptr
    的方法,而不是自己管理内存。
    std::string name;
    std::getline(std::cin, name);
    
    if(!std::cin) {
      // input failed
    }