无法使用 cin.getline 读取字符数组

Posted

技术标签:

【中文标题】无法使用 cin.getline 读取字符数组【英文标题】:Unable to read char array using cin.getline 【发布时间】:2016-03-08 13:44:46 【问题描述】:

我们被要求创建一个执行以下操作的类:

    输入 int ecodechar enamebasicpay 现在在课堂上,我们必须计算 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 &gt;&gt; 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()的区别

使用 cin.getline(.) 将 char 数组转换为字符串

3c++的getline与get

get()与getline()

如何输入带空格的字符串

C++字符串使用整理