C++ 不要进入我的cin

C++ Don't enter in my cin

本文关键字:我的 cin C++      更新时间:2023-10-16

我有一个不理解的小问题。我尝试了很多我在网上读到的东西,但都不起作用。

我的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工作得很好(Name和NumClub),当他到达cin的地址时,它会直接进入并进入主目录。我不能为这个地址写任何东西。

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

谢谢你的帮助!

这里有几个问题:

  1. cin>>nc不会从流中移除尾端线。因此,下一个s.getline(Buffer,20)实际上读取了这个字符,因此在键入其他字符之前退出。

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

  3. cin>>nc只解析匹配的输入。因此,如果有人没有输入数字,它仍将与\n一起在流中。

  4. 使用单个运算符>>调用来请求用户的多个输入是非常不寻常的,因为这是一种意外的副作用。想象一下有人使用运算符>>读取文件流。那会很奇怪。。。

我的建议:不要使用运算符>>,而是在Club中创建一个名为"fillFromStdin()"的成员函数。最好是有一个专门的工厂,但一开始还可以。然后避免混合getline和>>运算符。这有一些丑陋的副作用。最好只使用getline,然后再解析输入。