我在c ++学习课程。所以,我正在学习如何使用对象数组。
当我尝试从用户那里获取名称时,如果用户为名称输入的单词不止一个,那么第一次正确接收名称时会发生以下情况。但是第二次跳过该名称并提示用户输入没有输入名称的年龄。我尝试使用字符串而不是char数组来获取名称,即使我仍然遇到同样的问题。
我尝试使用cin.ignore()
。但我仍然无法找到问题的解决方案。
我的要求:
1。要在用户输入时输入名称中的多个字词。
2. 最后打印所有数据(从用户收到的姓名和年龄)。
提前感谢所有帮助过的人!
CODE:
// Array of objects
#include<iostream>
#include<conio.h>
//#include<string>
using namespace std;
#define SIZE 30
class employee
{
char name[SIZE];
float age;
public:
void getdata();
void putdata();
};
void employee::getdata()
{
cout << "Enter name:";
cin.getline(name, sizeof(name));
cin.ignore();
cout << "Enter age:";
cin >> age;
}
void employee::putdata()
{
cout << "Name is " << name << endl;
cout << "Age is " << age << endl;
}
const int size = 3;
int main()
{
employee manager[size];
for(int i = 0; i < size; i++){
cout << "\nThe details of the manager " << i+1 << endl;
manager[i].getdata();
}
cout << endl;
for(int i = 0 ; i < size; i++){
cout << "\nManager " << i+1 << endl;
manager[i].putdata();
}
getch();
return 0;
}
答案 0 :(得分:1)
实际上,这个错误很小但很重要:
cin.ignore()
的来电可能适用于name
输入超过SIZE - 1
字符的情况。因此,它的调用应该是有条件的:
如果函数不提取任何字符,或者如果找不到分隔字符(n-1)字符已经写入s,则设置failbit标志。请注意,如果输入序列中跟随那些(n-1)个字符的字符恰好是分隔字符,则它也会被提取并且未设置failbit标志(提取的序列恰好是n个字符长)。
(取自std::istream::ignore。)
目前,我只是将其排除在外。
以下cin >> age;
读取浮点数(因为age
的类型为float
)。输入流中保留以下分隔符。因此,下一个输入将接收它,这是下一个管理者的名称。
我的第一个想法是用std::istream& std::getline(std::istream&, std::string&);
阅读。然而,在了解了std::istream::ignore()
之后,我修改了样本&nash;它也有效。
这里修改了OP的样本:
// Array of objects
#include<iostream>
//#include<conio.h>
#include<string>
using namespace std;
#define SIZE 30
class employee
{
char name[SIZE];
float age;
public:
void getdata();
void putdata();
};
void employee::getdata()
{
cout << "Enter name:";
cin.getline(name, sizeof(name));
//EXCLUDED: cin.ignore();
cout << "Enter age:";
cin >> age;
//INSERTED:
// skip rest of line
#if 0 // Tried first:
string dummy; getline(cin, dummy);
#else // but now use:
cin.ignore();
#endif // 0
}
void employee::putdata()
{
cout << "Name is " << name << endl;
cout << "Age is " << age << endl;
}
const int size = 3;
int main()
{
employee manager[size];
for(int i = 0; i < size; i++){
cout << "\nThe details of the manager " << i+1 << endl;
manager[i].getdata();
}
cout << endl;
for(int i = 0 ; i < size; i++){
cout << "\nManager " << i+1 << endl;
manager[i].putdata();
}
//getch();
return 0;
}
在ideone上进行了编译和测试。
输入:
Michael
32
Jack
48
Joseph
53
输出:
The details of the manager 1
Enter name:Enter age:
The details of the manager 2
Enter name:Enter age:
The details of the manager 3
Enter name:Enter age:
Manager 1
Name is Michael
Age is 32
Manager 2
Name is Jack
Age is 48
Manager 3
Name is Joseph
Age is 53
注意:
对于ideone的测试,输入被重定向。因此,它没有反映出看起来有点奇怪。但是,输出显示应用程序已正确接收它。