100分求助,cin可以输入字符串吗?cin.getline()怎么有问题?两段程序的对比
时间:2011-12-13
来源:互联网
#include <iostream>
#include <iomanip>
using namespace std;
class person
{
int no;
char name[10];
public:
void input()
{
cout<<" 编号:";cin>>no;
cout<<" 姓名:";cin>>name;
}
void disp()
{
cout<<" 编号:"<<no<<endl;
cout<<" 姓名:"<<name<<endl;
}
};
class student:public person
{
private:
char depart[6];
int degree;
public:
void input()
{
person::input();
cout<<" 班号:"; cin>>depart;
cout<<" 成绩:"; cin>>degree;
}
void disp()
{
person::disp();
cout<<" 班号:"<<depart<<endl;
cout<<" 成绩:"<<degree<<endl;
}
};
class teacher:public person
{
private:
char prof[10];
char depart[10];
public:
void input()
{
person::input();
cout<<" 职称:"; cin>>prof;
cout<<" 部门:"; cin>> depart ;
}
void disp()
{
person::disp();
cout<<" 职称:"<< prof<<endl;
cout<<" 部门:"<< depart <<endl;
}
//第二段,就把cin换成了cin.getline()函数,结果,希望输入编号,姓名,班号,成绩,但是输入编号后,姓名就是不让输,然后班号让输了,奇怪
#include <iostream>
#include <iomanip>
#include <stiring>
using namespace std;
class person
{
int no;
char name[10];
public:
void input()
{
cout<<" 编号:";cin>>no;
cout<<" 姓名:";cin.getline(name,10);
}
void disp()
{
cout<<" 编号:"<<no<<endl;
cout<<" 姓名:"<<name<<endl;
}
};
class student:public person
{
private:
char depart[6];
int degree;
public:
void input()
{
person::input();
cout<<" 班号:"; cin.getline(depart,6);
cout<<" 成绩:"; cin>>degree;
}
void disp()
{
person::disp();
cout<<" 班号:"<<depart<<endl;
cout<<" 成绩:"<<degree<<endl;
}
};
class teacher:public person
{
private:
char prof[10];
char depart[10];
public:
void input()
{
person::input();
cout<<" 职称:"; cin.getline(prof,10);
cout<<" 部门:"; cin.getline(depart,10) ;
}
void disp()
{
person::disp();
cout<<" 职称:"<< prof<<endl;
cout<<" 部门:"<< depart <<endl;
}
};
void main()
{
student s1;
teacher t1;
cout<<"输入一个学生数据:\n"; s1.input();
cout<<"输入一个教师数据:\n"; t1.input();
cout<<"显示一个学生数据:\n"; s1.disp();
cout<<"显示一个教师数据:\n"; t1.disp();
}
作者: blase2234 发布时间: 2011-12-13
当你使用cin.getline()函数遇到结束符也就是换行符会结束输入,同时会跳过换行符
头文件中的
#include <string>
作者: kingstar158 发布时间: 2011-12-13
#include <iostream> #include <iomanip> #include <string> using namespace std; class person { int no; char name[10]; public: void input() { cout<<" 编号:"; cin>>no; cout<<" 姓名:"; rewind(stdin); cin.getline(name,10); } void disp() { cout<<" 编号:"<<no<<endl; cout<<" 姓名:"<<name<<endl; } }; class student:public person { private: char depart[6]; int degree; public: void input() { person::input(); cout<<" 班号:"; cin.getline(depart,6); rewind(stdin); cout<<" 成绩:"; cin>>degree; rewind(stdin); } void disp() { person::disp(); cout<<" 班号:"<<depart<<endl; cout<<" 成绩:"<<degree<<endl; } }; class teacher:public person { private: char prof[10]; char depart[10]; public: void input() { person::input(); cout<<" 职称:"; cin.getline(prof,10); rewind(stdin); cout<<" 部门:"; cin.getline(depart,10) ; rewind(stdin); } void disp() { person::disp(); cout<<" 职称:"<< prof<<endl; cout<<" 部门:"<< depart <<endl; } }; void main() { student s1; teacher t1; cout<<"输入一个学生数据:\n"; s1.input(); cout<<"输入一个教师数据:\n"; t1.input(); cout<<"显示一个学生数据:\n"; s1.disp(); cout<<"显示一个教师数据:\n"; t1.disp(); }
要用getline,最好在之前调用rewind(stdin)清空缓冲区,否则getline会直接从缓冲区读取,遇到'\n'结束(默认)。
作者: riyueming184 发布时间: 2011-12-13
cin.clear();不然你还没有输入姓名,系统就把缓冲区中的回车给你自动读入,想当你给姓名输入了一个回车。
C/C++ code
cin>>no; cin.clear(); cin.getline(name,10);
作者: yuegeman 发布时间: 2011-12-13
C/C++ code
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
class person
{
int no;
char name[10];
public:
void input()
{
cout<<" 编……
作者: blase2234 发布时间: 2011-12-13
但是我每次输入后都打回车,为什么不让我我输入姓名?
引用 2 楼 riyueming184 的回复:
C/C++ code
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
class person
{
int no;
char name[10];
public:……
这是因为在getline之前,缓冲区中有回车,getline直接读取缓冲区中的数据,遇到回车时,就会退出,所以你在输入编号之后,缓冲区中就已经有回车了,getline直接把编号当成是输入,你可以跟踪看看,那个name数组是否有值.
作者: riyueming184 发布时间: 2011-12-13
因为getline有三个参数,第三个参数是字符串的结束符,也就是当getline遇到这个结束符时,就不在接受输入了,第一次按回车表示字符串结束,第二次按回车才开始输出。所以在下一次输入之前要清楚掉缓冲区,可以用
cin.clear();不然你还没有输入姓名,系统就把缓冲区中的回车给你自动读入,想当你给姓名输入了一个回车。
C/C++ code
cin>>no;
cin.clear();……
作者: blase2234 发布时间: 2011-12-13
“因为getline有三个参数,第三个参数是字符串的结束符,也就是当getline遇到这个结束符时,就不在接受输入了,第一次按回车表示字符串结束,第二次按回车才开始输出。所以在下一次输入之前要清楚掉缓冲区,可以用
cin.clear();不然你还没有输入姓名,系统就把缓冲区中的回车给你自动读入,想当你给姓名输入了一个回车。
”
这个解释对吗,多谢!
C/C++ code
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
class person
{
int no;
char name[10];
public:
void input()
{
cout<<" 编……
作者: blase2234 发布时间: 2011-12-13
rewind是重新指向流。
在这里也可以使用cin.sync(),sync是清空流的动作。
cin.clear()是清空错误标记,一般使用clear()和sync()搭配使用,因为如果出现错误,而只是清空流的话,也是会出问题。
C/C++ code
#include <iostream> #include <iomanip> #include <string> using namespace std; class person { int no; char name[10]; public: void input() { cout<<" 编号:"; cin>>no; cout<<" 姓名:"; // rewind(stdin); cin.clear(); cin.sync(); cin.getline(name,10); } void disp() { cout<<" 编号:"<<no<<endl; cout<<" 姓名:"<<name<<endl; } }; class student:public person { private: char depart[6]; int degree; public: void input() { person::input(); cout<<" 班号:"; cin.getline(depart,6); cout<<" 成绩:"; cin>>degree; } void disp() { person::disp(); cout<<" 班号:"<<depart<<endl; cout<<" 成绩:"<<degree<<endl; } }; class teacher:public person { private: char prof[10]; char depart[10]; public: void input() { person::input(); cout<<" 职称:"; cin.getline(prof,10); cout<<" 部门:"; cin.getline(depart,10) ; } void disp() { person::disp(); cout<<" 职称:"<< prof<<endl; cout<<" 部门:"<< depart <<endl; } }; void main() { student s1; teacher t1; cout<<"输入一个学生数据:\n"; s1.input(); cout<<"输入一个教师数据:\n"; t1.input(); cout<<"显示一个学生数据:\n"; s1.disp(); cout<<"显示一个教师数据:\n"; t1.disp(); }
作者: riyueming184 发布时间: 2011-12-13
作者: ielxd1989 发布时间: 2011-12-13
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28