【发布时间】:2016-03-08 13:44:46
【问题描述】:
我们被要求创建一个执行以下操作的类:
- 输入 int ecode、char ename 和 basicpay
- 现在在课堂上,我们必须计算 net_pay = basicpay*11/10
- 最后,我们必须输出 ecode、ename 和 net_pay。
问题指出 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。
字符串大小 > 20
如果我输入一个字符数大于 20 的字符串,那么溢出的字符会变为浮点数,并产生错误。所以为了解决这个问题,我需要一个 cin.ignore(),但即使这样也不起作用!
问题
我进退两难了。对于一种字符串大小,cin.ignore() 是有问题的,但对于其他字符串则没有效果。什么可以用,什么不能用?两者都在制造相互冲突。请帮帮我!
【问题讨论】:
-
使用
std::stringversion ofstd::getline- 不用再担心名字的长度了! -
std::string,而不是char[]。std::getline(),不是std::iostream::getline()。文字,不是截图。请。 (为什么你的导师不教你这个?) -
@BoBTFish 我使用了 string 和 getline 并且效果很好。基本上,我到处都使用标准的 c++。但是我们的老师偏向于旧的Turbo C++类型C++,而且她需要C类型的代码。我在学校表现得好像 std::string 不存在一样。我们被要求编写非标准代码,所以我别无选择!
-
@samjoe 我知道这是非常普遍的做法,但我无法想象你的学校(和其他人)如何相信他们实际上是通过教你 20 岁以上的风格和技巧来为你的工作做好准备已经过时了。
-
@samjoe 你,也许还有一群其他学生,可以向系主任,或者最好是系外更高的人投诉吗?他们正在积极地给你带来比根本不学习 C++ 更大的伤害。 +1 尝试在课外正确学习它。