C ++不要进入我的cin

时间:2017-01-14 15:40:20

标签: c++ operator-overloading cin istream

我有一点我不明白的问题。我尝试了很多我在互联网上阅读的东西,但没有任何实际工作。

我的main.cpp代码:

#include <iostream>
using namespace std;
#include "Equipe.h"
#include "Club.h"

//PROTOTYPE
void MenuSecClub();
void MenuSecFed();


int main(int argc,char* argv[])
{
    int choice;
    //cout << " Welcome heeere !!!" << endl;
    Club C;
    cin >> C;
    cout << " hello : " << C;
    cin >> choice;
    return 0;
}

我的俱乐部istream代码

istream& operator>>(istream& s,Club& C)
{
    int nc;
    char Buffer[20],Buffer2[20];
    cout << "Enter a name" << endl;
    s.getline(Buffer,20);
    C.setNom(Buffer);
    s.clear();
    cout << "Enter a num club" << endl;
    cin >> nc;
    C.setNumClub(nc);
    s.clear();
    cout << "Enter the address of the club" << endl;
    s.getline(Buffer,20);
    C.setAdresse(Buffer);
    s.clear(); 

    return s;   
}

前两个cin工作得很好(姓名和NumClub),当他到达cin时,它传入的地址直接传递到主要的cout。我不能为地址写任何东西。

我已经尝试了清除,我已经为getline尝试了第二个缓冲区。我不明白发生了什么。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

这里有几个问题:

  1. cin&gt;&gt; nc不会从流中删除尾随行。所以下一个s.getline(Buffer,20)实际上读取了这个\ n字符,因此在输入任何其他内容之前退出。

  2. 您认为s.clear()似乎会清除流的剩余内容,但事实并非如此。它只是重置标志。这就是\ n仍然在流中的原因。

  3. cin&gt;&gt; nc只解析匹配的输入。因此,如果有人没有输入数字,它仍然会与\ n一起出现在流中。

  4. 使用单个运算符&gt;&gt;要求用户输入多个输入的呼叫是非常不寻常的,因为这是一个意想不到的副作用。想想有人使用运算符&gt;&gt;从文件流中读取。那会很奇怪......

  5. 我的提议:不使用运算符&gt;&gt;而是在Club中创建一个成员函数,例如“fillFromStdin()”。更好的是一个专门的工厂,但这一切都没问题。然后避免混合getline和&gt;&gt;运营商。这有一些ugly side effects。最好只使用getline,然后解析输入。