+ -
当前位置:首页 → 问答吧 → 100分求助,cin可以输入字符串吗?cin.getline()怎么有问题?两段程序的对比

100分求助,cin可以输入字符串吗?cin.getline()怎么有问题?两段程序的对比

时间:2011-12-13

来源:互联网

//好像第一段执行没问题,但是不知道为什么cin可以输入字符串,原来不是说cin只能输入一个字符的吗?
#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当然可以输入字符串了,根据你输入的变量而定
当你使用cin.getline()函数遇到结束符也就是换行符会结束输入,同时会跳过换行符
头文件中的
#include <string>

作者: kingstar158   发布时间: 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<<" 编号:";
        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

因为getline有三个参数,第三个参数是字符串的结束符,也就是当getline遇到这个结束符时,就不在接受输入了,第一次按回车表示字符串结束,第二次按回车才开始输出。所以在下一次输入之前要清楚掉缓冲区,可以用
cin.clear();不然你还没有输入姓名,系统就把缓冲区中的回车给你自动读入,想当你给姓名输入了一个回车。
C/C++ code
cin>>no;
cin.clear();
cin.getline(name,10);

作者: yuegeman   发布时间: 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:
void input()
{
cout<<" 编……

作者: blase2234   发布时间: 2011-12-13

引用 4 楼 blase2234 的回复:
但是我每次输入后都打回车,为什么不让我我输入姓名?

引用 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

我试过了,加上cin.clear();还是不行
引用 3 楼 yuegeman 的回复:
因为getline有三个参数,第三个参数是字符串的结束符,也就是当getline遇到这个结束符时,就不在接受输入了,第一次按回车表示字符串结束,第二次按回车才开始输出。所以在下一次输入之前要清楚掉缓冲区,可以用
cin.clear();不然你还没有输入姓名,系统就把缓冲区中的回车给你自动读入,想当你给姓名输入了一个回车。

C/C++ code
cin>>no;
cin.clear();……

作者: blase2234   发布时间: 2011-12-13

我试过了,你的做法是对的,但是能详细解释一下吗,还有楼下的解释对吗
“因为getline有三个参数,第三个参数是字符串的结束符,也就是当getline遇到这个结束符时,就不在接受输入了,第一次按回车表示字符串结束,第二次按回车才开始输出。所以在下一次输入之前要清楚掉缓冲区,可以用
cin.clear();不然你还没有输入姓名,系统就把缓冲区中的回车给你自动读入,想当你给姓名输入了一个回车。

这个解释对吗,多谢!
引用 2 楼 riyueming184 的回复:
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

getline是有三个参数,默认情况下,第三个参数是'\n',也就是换行符。getline会在读取时,检查所读取的值数否是这个参数所指定的字符,如果是,就停止读入,并将此字符从缓冲区中取出抛弃,所以连续使用getline不会有问题。而你的问题是,出现的原因是基于cin的操作符>>与getline不一些不同引起的:>>操作符在读完之后,并不读取'\n'而是留在了缓冲区,如果你下次用>>读取,此操作符会自动略过'\n'字符。然而getline函数却不会略过'\n',而是当成结束标记,如果你依此跟踪的话,会发现getline读取的字符串是空的。所以如果用>>读取完成后转用getline那就需要清空缓冲区。
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