我们被要求创建一个执行以下操作的类:
问题表明net_pay变量无法创建,其值只需用于输出,并且该值必须使用单独的成员函数 calc
计算这是我的代码:
// Class employee
#include <iostream>
#include <cstdio>
using std::cin;
using std::cout;
class emp {
int ecode;
char ename[20];
float basic_pay;
public:
void input() {
cin >> ecode;
cin.ignore();
cin.getline( ename, 20); // <-- PROBLEM HERE
cin >> basic_pay;
}
float calc( float x) {
return x+x/10;
}
void output() {
cout << "\n Emp. code: " << ecode;
cout << "\n Emp. name: " << ename;
cout << "\n Emp. basic pay: " << basic_pay;
cout << "\n Emp. net pay: " << calc( basic_pay);
}
};
int main() {
emp e1;
cout << "Enter details of employee:\n";
e1.input();
cout << "\nUpdated Profile:\n";
e1.output();
return 0;
}
过去一小时我对cin.getline
的这个问题感到沮丧。
代码工作正常,输入字符串大小小于20,所以我不需要cin.ignore(),如果我使用它,cin.ignore
正在删除basic_pay
的第一个数字:
查看图片:两者均适用于小字符串输入。第二个是cin.ignore()
请注意以下内容:Basic_pay为1100,但忽略了1
。
如果我输入一个char数大于20的字符串,那么溢出的char将浮动,并产生错误。所以为了解决这个问题,我需要一个cin.ignore(),但即使这样也行不通!
我处于两难境地。对于一个字符串大小,cin.ignore()
是有问题的,但对于其他字符串,它没有任何效果。用什么,什么不用?两者都在制造相互冲突。请帮帮我!
答案 0 :(得分:0)
cin.getline(name, 20)
只能获得19个字符(一个是为'\ 0'保留的),因此,如果有人输入20或更多,则cin.getline(name, 20)
将失败,下一个cin >> basic_pay
由于仍然设置了流错误标志,因此也会失败,您需要使用cin.clear()
清除它们。
修正:
#include <limits> // for numeric_limits
if (!cin.getline(ename, 20)) // <-- PROBLEM HERE
{
std::cout << "Name too long, trimmed to: " << ename << std::endl;
// clear the stream error flags and ignore rest of the line
cin.clear();
cin.ignore(std::numeric_limits<int>::max(), '\n');
}
// now this line will not fail
cin >> basic_pay;