class clsEmployee
{
private:
string sName;
unsigned int uiEmployeeID;
static unsigned int uiEmpCounter;
public:
clsEmployee()
{
uiEmpCounter++;
uiEmployeeID = uiEmpCounter;
}
void Print()
{
cout << "Name " << setw(40) << sName << " ID " << uiEmployeeID << endl;
}
void Set()
{
cout << "Enter Name of the employeer" << endl;
getline(cin, sName, '\n');
}
};
unsigned int clsEmployee::uiEmpCounter;
int main()
{
short siCounter = 0;
clsEmployee Employee[10];
string strEmpName;
char cCheck;
do
{
Employee[siCounter].Set();
if (siCounter == 9)
{
cout << "Enough!" << endl;
break;
}
else
{
cout << "Wanna enter more? (y/n) >";
cin >> cCheck;
}
siCounter++;
for ( int i = 0; i < siCounter; i++)
{
Employee[i].Print();
}
return 0;
}
Судя по коду, должно попросить 10 раз ввести данные и вывести их, но происходит следующее:
Enter Name of the employeer
a
Wanna enter more? (y/n) >y
Enter Name of the employeer
Wanna enter more? (y/n) >b
Enter Name of the employeer
Wanna enter more? (y/n) >c
Enter Name of the employeer
Wanna enter more? (y/n) >d
Enter Name of the employeer
Wanna enter more? (y/n) >e
Enter Name of the employeer
Wanna enter more? (y/n) >f
Enter Name of the employeer
Wanna enter more? (y/n) >g
Enter Name of the employeer
Wanna enter more? (y/n) >h
Enter Name of the employeer
Wanna enter more? (y/n) >i
Enter Name of the employeer
Enough!
Name a ID 1
Name ID 2
Name ID 3
Name ID 4
Name ID 5
Name ID 6
Name ID 7
Name ID 8
Name ID 9
Здравствуйте, php-coder, Вы писали:
PC>Здравствуйте, DukeNukem3D, Вы писали:
DND>> void Set() DND>> { DND>> cout << "Enter Name of the employeer" << endl; DND>> getline(cin, sName, '\n'); DND>> } DND>>};
PC>Попробуйте заменить getline(cin, sName, '\n'); на getline(cin, sName); и подключить хедер string
Заменил, но не помогло — ведет себя точно также.
DND>> do DND>> {
PC>Вы, видимо, код не правильно/не весь привели, потому что у вас тут есть do и нигде нет while() закрывающего.
да, прошу прощения, вот весь код
#include <iostream> //cin, cout#include <string> //standard c++ clacc#include <iomanip> //setwusing namespace std;
lass clsEmployee
{
private:
string sName;
unsigned int uiEmployeeID;
static unsigned int uiEmpCounter;
public:
clsEmployee()
{
uiEmpCounter++;
uiEmployeeID = uiEmpCounter;
}
void Print()
{
cout << "Name " << setw(40) << sName << " ID " << uiEmployeeID << endl;
}
void Set()
{
cout << "Enter Name of the employeer" << endl;
getline(cin, sName);
}
};
unsigned int clsEmployee::uiEmpCounter;
int main()
{
short siCounter = 0;
clsEmployee Employee[10];
string strEmpName;
char cCheck;
do
{
cCheck = 'n';
Employee[siCounter].Set();
if (siCounter == 9)
{
cout << "Enough!" << endl;
break;
}
else
{
cout << "Wanna enter more? (y/n) >";
cin >> cCheck;
}
siCounter++;
}
while (cCheck != 'n');
for ( int i = 0; i < siCounter; i++)
{
Employee[i].Print();
}
return 0;
}
Отрабатывает следующим образом:
1) выводится просьба
2) cin<<c передаёт управление консоли
3) консоль ожидает завершения ввода (для неё это символы LF или EOF)
4) ты вводишь 'Y' и LF (чтобы завершить ожидание)
5) консоль возвращает управление
6) cin<<c читает первый символ ('Y'), в буфере остаётся LF
7) getline() читает строку до LF включительно — что, собственно, ты и наблюдаешь.
Необходимо после чтения однобуквенного ответа очищать буфер до конца строки.
Здравствуйте, Were, Вы писали:
W>Вы неправильно вводите данные, надо так:
W>
W>Enter Name of the employeer
W>a
W>Wanna enter more? (y/n) >y
W>Enter Name of the employeer
W>b
W>Wanna enter more? (y/n) >y
W>Enter Name of the employeer
W>c
W>
W>И так далее, так как первый раз данные считывает cin >> cCheck;, а затем уже getline(cin, sName, '\n');
Я сделал так:
cout << "Wanna enter more? (y/n) >";
cin >> cCheck;
cout << "Enter Name of the employeer" << endl;
getline(cin, sName, '\n');
Но оно также продолжает чудить:
Enter Name of the employeer
a
Wanna enter more? (y/n) >y
Enter Name of the employeer
Wanna enter more? (y/n) >y
Enter Name of the employeer
Wanna enter more? (y/n) >
я вот думаю — а может просто виндовая консоль и линуксовая отличаются? я в линуксе пишу сейчас
К>Отрабатывает следующим образом: К>1) выводится просьба К>2) cin<<c передаёт управление консоли К>3) консоль ожидает завершения ввода (для неё это символы LF или EOF) К>4) ты вводишь 'Y' и LF (чтобы завершить ожидание) К>5) консоль возвращает управление К>6) cin<<c читает первый символ ('Y'), в буфере остаётся LF К>7) getline() читает строку до LF включительно — что, собственно, ты и наблюдаешь.
К>Необходимо после чтения однобуквенного ответа очищать буфер до конца строки.
К>>Отрабатывает следующим образом: К>>1) выводится просьба К>>2) cin<<c передаёт управление консоли К>>3) консоль ожидает завершения ввода (для неё это символы LF или EOF) К>>4) ты вводишь 'Y' и LF (чтобы завершить ожидание) К>>5) консоль возвращает управление К>>6) cin<<c читает первый символ ('Y'), в буфере остаётся LF К>>7) getline() читает строку до LF включительно — что, собственно, ты и наблюдаешь.
К>>Необходимо после чтения однобуквенного ответа очищать буфер до конца строки.
DND>Хорошо, а как очистить буфер?
Порылся в доках, сделал так:
cout << "Enter Name of the employeer" << endl;
getline(cin, sName);
cout << "Wanna enter more? (y/n) >";
cin >> cCheck;
cin.sync();
ведет себя также:
Enter Name of the employeer
a
Wanna enter more? (y/n) >y
Enter Name of the employeer
Wanna enter more? (y/n) >y
Enter Name of the employeer
Wanna enter more? (y/n) >n
Name a ID 1
Name ID 2
Name ID 3
Здравствуйте, lkss, Вы писали:
L>Здравствуйте, DukeNukem3D, Вы писали:
DND>>cout << "Enter Name of the employeer" << endl; DND>>getline(cin, sName); DND>>cout << "Wanna enter more? (y/n) >"; DND>>cin >> cCheck; DND>>cin.sync();
L>можно попробовать использовать cin.ignore()