使用getline在char数组中存储word在循环中使用时无法正常工作?

时间:2018-02-21 09:19:29

标签: c++ oop

我在c ++学习课程。所以,我正在学习如何使用对象数组。 当我尝试从用户那里获取名称时,如果用户为名称输入的单词不止一个,那么第一次正确接收名称时会发生以下情况。但是第二次跳过该名称并提示用户输入没有输入名称的年龄。我尝试使用字符串而不是char数组来获取名称,即使我仍然遇到同样的问题。 我尝试使用cin.ignore()。但我仍然无法找到问题的解决方案。

我的要求:

1。要在用户输入时输入名称中的多个字词。

2. 最后打印所有数据(从用户收到的姓名和年龄)。

提前感谢所有帮助过的人!

CODE:

// Array of objects

#include<iostream>
#include<conio.h>
//#include<string>
using namespace std;
#define SIZE 30
class employee
{
    char name[SIZE];
    float age;
public:
    void getdata();
    void putdata();
};

void employee::getdata()
{
    cout << "Enter name:";
    cin.getline(name, sizeof(name));
    cin.ignore();

    cout << "Enter age:";
    cin >> age;
}

void employee::putdata()
{
    cout << "Name is " << name << endl;
    cout << "Age is " << age << endl;
}

const int size = 3;

int main()
{
    employee manager[size];
    for(int i = 0; i < size; i++){
        cout << "\nThe details of the manager " << i+1 << endl;
        manager[i].getdata();
    }
    cout << endl;

    for(int i = 0 ; i < size; i++){
        cout << "\nManager " << i+1 << endl;
        manager[i].putdata();
    }

    getch();
    return 0;
}

1 个答案:

答案 0 :(得分:1)

实际上,这个错误很小但很重要:

cin.ignore()的来电可能适用于name输入超过SIZE - 1字符的情况。因此,它的调用应该是有条件的:

  

如果函数不提取任何字符,或者如果找不到分隔字符(n-1)字符已经写入s,则设置failbit标志。请注意,如果输入序列中跟随那些(n-1)个字符的字符恰好是分隔字符,则它也会被提取并且未设置failbit标志(提取的序列恰好是n个字符长)。

(取自std::istream::ignore。)

目前,我只是将其排除在外。

以下cin >> age;读取浮点数(因为age的类型为float)。输入流中保留以下分隔符。因此,下一个输入将接收它,这是下一个管理者的名称。

我的第一个想法是用std::istream& std::getline(std::istream&, std::string&);阅读。然而,在了解了std::istream::ignore()之后,我修改了样本&nash;它也有效。

这里修改了OP的样本:

// Array of objects

#include<iostream>
//#include<conio.h>
#include<string>
using namespace std;
#define SIZE 30
class employee
{
    char name[SIZE];
    float age;
public:
    void getdata();
    void putdata();
};

void employee::getdata()
{
    cout << "Enter name:";
    cin.getline(name, sizeof(name));
    //EXCLUDED: cin.ignore();

    cout << "Enter age:";
    cin >> age;

    //INSERTED:
    // skip rest of line
#if 0 // Tried first:
    string dummy; getline(cin, dummy);
#else // but now use:
    cin.ignore();
#endif // 0
}

void employee::putdata()
{
    cout << "Name is " << name << endl;
    cout << "Age is " << age << endl;
}

const int size = 3;

int main()
{
    employee manager[size];
    for(int i = 0; i < size; i++){
        cout << "\nThe details of the manager " << i+1 << endl;
        manager[i].getdata();
    }
    cout << endl;

    for(int i = 0 ; i < size; i++){
        cout << "\nManager " << i+1 << endl;
        manager[i].putdata();
    }

    //getch();
    return 0;
}

ideone上进行了编译和测试。

输入:

Michael
32
Jack
48
Joseph
53

输出:

The details of the manager 1
Enter name:Enter age:
The details of the manager 2
Enter name:Enter age:
The details of the manager 3
Enter name:Enter age:

Manager 1
Name is Michael
Age is 32

Manager 2
Name is Jack
Age is 48

Manager 3
Name is Joseph
Age is 53

注意:

对于ideone的测试,输入被重定向。因此,它没有反映出看起来有点奇怪。但是,输出显示应用程序已正确接收它。