无法使用cin.getline

时间:2016-03-08 13:44:46

标签: c++ string class char cin

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

  1. 输入 int ecode char ename basicpay
  2. 现在上课时,我们必须计算 net_pay = basicpay * 11/10
  3. 最后,我们必须输出ecode,ename和net_pay。
  4. 问题表明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的这个问题感到沮丧。

    字符串大小&lt; 20

    代码工作正常,输入字符串大小小于20,所以我不需要cin.ignore(),如果我使用它,cin.ignore正在删除basic_pay的第一个数字:

    查看图片:两者均适用于小字符串输入。第二个是cin.ignore()

    enter image description here

    请注意以下内容:Basic_pay为1100,但忽略了1

    enter image description here

    字符串大小&gt; 20

    如果我输入一个char数大于20的字符串,那么溢出的char将浮动,并产生错误。所以为了解决这个问题,我需要一个cin.ignore(),但即使这样也行不通!

    enter image description here

    问题

    我处于两难境地。对于一个字符串大小,cin.ignore()是有问题的,但对于其他字符串,它没有任何效果。用什么,什么不用?两者都在制造相互冲突。请帮帮我!

1 个答案:

答案 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;

Live Demo