标题:请教一个使用 C++ 的 getline 函数时遇到的问题。本人是初学,望高手解答。
只看楼主
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
结帖率:100%
已结贴  问题点数:20 回复次数:10 
请教一个使用 C++ 的 getline 函数时遇到的问题。本人是初学,望高手解答。
晚生想通过下面一个程序录入人的姓名,身高,体重,经试运行发现cin>>输入的字符串不允许有空格,感觉受限制太多,于是根据网上某人的建议改用getline(cin, string),结果发现该变量好像只能写入一次似的,经循环语句再使用时,后面与它无关的cin>>语句都不能让我输入了,运行起来感觉好像只要一遇上cin>>就自动跳过去执行后面的语句一样。我到底错在哪里,求解。
#include <iostream>
#include <string>
using std::cout;
using std::cin;
using std::endl;
using std::string;
class Human
{
public:
  void GetName()
  {
      cout<<"请输入名字:";
      std::getline(std::cin, thename);
  }
  void GetStature()
     {
     cout<<"请输入身高(厘米):";
     cin>>stature;
     }
  void GetWeight()
     {
     cout<<"请输入体重(公斤):";
     cin>>weight;
     }
  void PrintStature(){cout<<"身高为:"<<stature<<"厘米"<<endl;}
  void PrintWeight(){cout<<"体重为:"<<weight<<"公斤"<<endl;}
  void PrintName(){cout<<"姓名为:"<<thename<<endl;}
private:
  string thename;
  int stature;
  int weight;
};
int main()
{
 char GoOn='y';
 Human *Xman=new Human;//定义指针对象
 while(GoOn=='y')
 {
     Xman->GetName();
     Xman->GetStature();
     Xman->GetWeight();
     Xman->PrintName();
     Xman->PrintStature();
     Xman->PrintWeight();
     cout<<"是否继续输入?(y/n)";
     cin>>GoOn;
     if(GoOn=='n'){break;}
 }
     delete Xman;
     return 0;
}
搜索更多相关主题的帖子: include public 字符串 网上 
2014-05-19 17:38
砖家的谎言
Rank: 12Rank: 12Rank: 12
等 级:禁止访问
威 望:30
帖 子:693
专家分:3898
注 册:2013-12-6
得分:1 
你运用其他的输入函数不行吗?C语言里面的sanf,getchar试试

我不是砖家,要努力成为砖家。
2014-05-19 18:02
funyh250
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:26
帖 子:290
专家分:1573
注 册:2013-12-25
得分:3 
要清除缓冲

学习是大事   吃喝拉撒睡是小事   其他的那都不是事
2014-05-19 18:21
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
得分:0 
那我试试其他输入函数再看看。
对了,请问楼上:清除缓冲该是什么语句来着?我是初学者没用过。谢谢
2014-05-19 18:36
funyh250
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:26
帖 子:290
专家分:1573
注 册:2013-12-25
得分:0 
cin.seekg(ios::cur);  将输入流定位到当前位置   要声明 using std::ios;
     Xman->GetName();
     Xman->GetStature();
     Xman->GetWeight();
     Xman->PrintName();
     Xman->PrintStature();
     Xman->PrintWeight();
     cin.clear();      清除缓冲
     cout<<"是否继续输入?(y/n)";
     cin>>GoOn;
     if(GoOn=='n'){break;}

学习是大事   吃喝拉撒睡是小事   其他的那都不是事
2014-05-19 18:41
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
得分:0 
回复 2 楼 砖家的谎言
请问这两种具体要怎么弄呢?
2014-05-19 18:42
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
得分:0 
回复 5 楼 funyh250
谢谢,我再试试看。
2014-05-19 18:42
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
得分:0 
回复 5 楼 funyh250
清除缓冲之后不再出现永久循环了,但仍然把代码中的cin>>忽略了过去,并且不按下"n"也退出了循环,不知怎么回事。郁闷。不过还是多谢你的解答。
2014-05-19 18:47
yxq211046
Rank: 2
等 级:论坛游民
帖 子:22
专家分:36
注 册:2014-4-17
得分:16 
改 void GetName()
  {
      cout<<"请输入名字:";
      std::getline(std::cin, thename);
  }

void GetName()
    {
        cout << "请输入名字:";
        cin.sync();
        std::getline(std::cin, thename);
    }
试试
2014-05-19 19:38
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
得分:0 
回复 9 楼 yxq211046
问题解决了,就是像你说的那样加一句cin.sync().
想知道这一句到底做了什么事?有这么大能耐。还望兄台不吝赐教。
2014-05-19 20:31



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-431782-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.056443 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved