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
}