getline 和 cin 相继使用跳过下一个输入
getline and cin used one after another skips next inputs
我正在编写一个 C++ 程序来演示聚合概念,在书中作为示例给出。该代码由 4 classes(在一个文件中)和一个 main 函数(在另一个文件中)组成。
class如下
#include <iostream>
#include <string>
/*#define SYNC_CLEAR {\
cin.clear();\
cin.sync();\
}
*/
using std::string;
using std::cout;
using std::cin;
class Student
{
private:
string school;
string degree;
public:
void input_data()
{
cout<<"Enter School name and degree name \n";
getline(cin,school);
getline(cin,degree);
}
void show_data() const
{
cout<<"School :"<<school<<",Degree: "<<degree<<"\n";
}
};
class Employee
{
private:
string name;
unsigned int number;
public:
void input_data()
{
string str;
cout<<"Enter Name and number \n";
getline(cin,name);
cin>>number;
}
void show_data() const
{
cout<<"Name :"<<name<<",number: "<<number<<"\n";
}
};
/************************Aggregation starts from here**********************************/
class Manager
{
private:
string title;
double dues;
Employee emp; // object of one class as an attribute to other class
Student stu; // object of one class as an attribute to other class
public:
**void input_data()
{
emp.input_data(); // call by object of Employee class
cout<<"Enter Title and Dues \n";
/*********Problem comes here*****************/
getline(cin,title);
cin>>dues;
/**************************/
stu.input_data(); // call by object of Student class
}**
void show_data() const
{
emp.show_data();
cout<<"Title :"<<title<<",Dues: "<<dues<<"\n";
stu.show_data();
}
};
class Scientist
{
private:
int pubs;
Employee emp; // object of one class as an attribute to other class
Student stu; // object of one class as an attribute to other class
public:
void input_data()
{
emp.input_data(); // call by object of Employee class
cout<<"Enter no of pubs \n";
cin>>pubs;
stu.input_data(); // call by object of Student class
}
void show_data() const
{
emp.show_data();
cout<<" pubs :"<<pubs<<"\n";
stu.show_data();
}
};
主要功能如下:
#include <iostream>
#include "aggregation.h"
using std::cout;
using std::cin;
int main(int argc, char const *argv[])
{
Manager m1;
Scientist s1,s2;
cout<<"Data for Manager\n";
m1.input_data();
cout<<"Data for Sci 1\n";
s1.input_data();
cout<<"Data for Sci 2\n";
s2.input_data();
cout<<"Data for Manager\n";
m1.show_data();
cout<<"Data for Sci 1\n";
s1.show_data();
cout<<"Data for Sci 2\n";
s2.show_data();
return 0;
}
问题出在 Class 管理器的 input_data() 函数中(以粗体突出显示)。我在控制台附加输出
hduser@M-1939:~/Dropbox/c++/lafore/inhertiance$ g++ -g aggregation.cpp -o aggregation
hduser@M-1939:~/Dropbox/c++/lafore/inhertiance$ ./aggregation
Data for Manager
Enter Name and number
vivek
100
***Enter Title and Dues
sr manager***
Enter School name and degree name
Data for Sci 1
Enter Name and number
Enter no of pubs
Enter School name and degree name
Data for Sci 2
Enter Name and number
Enter no of pubs
Enter School name and degree name
Data for Manager
Name :vivek,number: 100
Title :,Dues: 0
School :,Degree:
Data for Sci 1
Name :,number: 6299824
pubs :6299824
School :,Degree:
Data for Sci 2
Name :,number: 2092888488
pubs :6299112
School :,Degree:
我查看了一些使用 cin.clear() 和 cin.sync() 的链接,但效果不佳。有问题,不是这样,不同但仍然是类似的问题。
有线索吗?
编辑 1:我使用将输入序列从 1:getline 2:cin 更改为 1:cin 2:cin.ignore() 3:getline 并且它正在工作。但是谁能告诉我怎么做?为什么以前的方法不行。
编辑 2:我忘记在员工 class 的 input_data() 中的 cin>>number 之后放置 cin.ignore()。它让它工作了吗?虽然是个愚蠢的错误。
你需要做的是在 cin
.
之后 cin.ignore()
这是发生了什么:
当您使用 std::getline
时,它将获取该行上的任何内容,直到换行符,但是 cin
在执行读取后实际上并没有删除换行符,因此您的 std::getline
只得到一个空字符串。
使用:
cin.ignore(256,'\n');
每次 cin 调用后清理缓冲区。
256是要忽略的字符数,'\n'是分隔符。
为了安全起见,可以使用
std::numeric_limits<std::streamsize>::max()
作为字符数限制;我就是喜欢256.
我正在编写一个 C++ 程序来演示聚合概念,在书中作为示例给出。该代码由 4 classes(在一个文件中)和一个 main 函数(在另一个文件中)组成。 class如下
#include <iostream>
#include <string>
/*#define SYNC_CLEAR {\
cin.clear();\
cin.sync();\
}
*/
using std::string;
using std::cout;
using std::cin;
class Student
{
private:
string school;
string degree;
public:
void input_data()
{
cout<<"Enter School name and degree name \n";
getline(cin,school);
getline(cin,degree);
}
void show_data() const
{
cout<<"School :"<<school<<",Degree: "<<degree<<"\n";
}
};
class Employee
{
private:
string name;
unsigned int number;
public:
void input_data()
{
string str;
cout<<"Enter Name and number \n";
getline(cin,name);
cin>>number;
}
void show_data() const
{
cout<<"Name :"<<name<<",number: "<<number<<"\n";
}
};
/************************Aggregation starts from here**********************************/
class Manager
{
private:
string title;
double dues;
Employee emp; // object of one class as an attribute to other class
Student stu; // object of one class as an attribute to other class
public:
**void input_data()
{
emp.input_data(); // call by object of Employee class
cout<<"Enter Title and Dues \n";
/*********Problem comes here*****************/
getline(cin,title);
cin>>dues;
/**************************/
stu.input_data(); // call by object of Student class
}**
void show_data() const
{
emp.show_data();
cout<<"Title :"<<title<<",Dues: "<<dues<<"\n";
stu.show_data();
}
};
class Scientist
{
private:
int pubs;
Employee emp; // object of one class as an attribute to other class
Student stu; // object of one class as an attribute to other class
public:
void input_data()
{
emp.input_data(); // call by object of Employee class
cout<<"Enter no of pubs \n";
cin>>pubs;
stu.input_data(); // call by object of Student class
}
void show_data() const
{
emp.show_data();
cout<<" pubs :"<<pubs<<"\n";
stu.show_data();
}
};
主要功能如下:
#include <iostream>
#include "aggregation.h"
using std::cout;
using std::cin;
int main(int argc, char const *argv[])
{
Manager m1;
Scientist s1,s2;
cout<<"Data for Manager\n";
m1.input_data();
cout<<"Data for Sci 1\n";
s1.input_data();
cout<<"Data for Sci 2\n";
s2.input_data();
cout<<"Data for Manager\n";
m1.show_data();
cout<<"Data for Sci 1\n";
s1.show_data();
cout<<"Data for Sci 2\n";
s2.show_data();
return 0;
}
问题出在 Class 管理器的 input_data() 函数中(以粗体突出显示)。我在控制台附加输出
hduser@M-1939:~/Dropbox/c++/lafore/inhertiance$ g++ -g aggregation.cpp -o aggregation
hduser@M-1939:~/Dropbox/c++/lafore/inhertiance$ ./aggregation
Data for Manager
Enter Name and number
vivek
100
***Enter Title and Dues
sr manager***
Enter School name and degree name
Data for Sci 1
Enter Name and number
Enter no of pubs
Enter School name and degree name
Data for Sci 2
Enter Name and number
Enter no of pubs
Enter School name and degree name
Data for Manager
Name :vivek,number: 100
Title :,Dues: 0
School :,Degree:
Data for Sci 1
Name :,number: 6299824
pubs :6299824
School :,Degree:
Data for Sci 2
Name :,number: 2092888488
pubs :6299112
School :,Degree:
我查看了一些使用 cin.clear() 和 cin.sync() 的链接,但效果不佳。有问题,不是这样,不同但仍然是类似的问题。 有线索吗?
编辑 1:我使用将输入序列从 1:getline 2:cin 更改为 1:cin 2:cin.ignore() 3:getline 并且它正在工作。但是谁能告诉我怎么做?为什么以前的方法不行。
编辑 2:我忘记在员工 class 的 input_data() 中的 cin>>number 之后放置 cin.ignore()。它让它工作了吗?虽然是个愚蠢的错误。
你需要做的是在 cin
.
之后 cin.ignore()
这是发生了什么:
当您使用 std::getline
时,它将获取该行上的任何内容,直到换行符,但是 cin
在执行读取后实际上并没有删除换行符,因此您的 std::getline
只得到一个空字符串。
使用:
cin.ignore(256,'\n');
每次 cin 调用后清理缓冲区。
256是要忽略的字符数,'\n'是分隔符。
为了安全起见,可以使用
std::numeric_limits<std::streamsize>::max()
作为字符数限制;我就是喜欢256.