无法使用 cin.getline 读取字符数组
Posted
技术标签:
【中文标题】无法使用 cin.getline 读取字符数组【英文标题】:Unable to read char array using cin.getline 【发布时间】: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::string
version of std::getline
- 不用再担心名字的长度了!
std::string
,而不是char[]
。 std::getline()
,不是std::iostream::getline()
。文字,不是截图。请。 (为什么你的导师不教你这个?)
@BoBTFish 我使用了 string 和 getline 并且效果很好。基本上,我到处都使用标准的 c++。但是我们的老师偏向于旧的Turbo C++类型C++,而且她需要C类型的代码。我在学校表现得好像 std::string 不存在一样。我们被要求编写非标准代码,所以我别无选择!
@samjoe 我知道这是非常普遍的做法,但我无法想象你的学校(和其他人)如何相信他们实际上是通过教你 20 岁以上的风格和技巧来为你的工作做好准备已经过时了。
@samjoe 你,也许还有一群其他学生,可以向系主任,或者最好是系外更高的人投诉吗?他们正在积极地给你带来比根本不学习 C++ 更大的伤害。 +1 尝试在课外正确学习它。
【参考方案1】:
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;
Live Demo
【讨论】:
以上是关于无法使用 cin.getline 读取字符数组的主要内容,如果未能解决你的问题,请参考以下文章
c++中 cincin.get()cin.getline()cin.getchar()的区别