【问题标题】:Run time error of cin.get() [duplicate]cin.get() 的运行时错误 [重复]
【发布时间】:2018-06-01 15:28:32
【问题描述】:
#include<iostream>
#include<string>
#include<cstring>

using namespace std;
void cpp_string();
void cstyle_string();

int main()
{
  cpp_string();
  cstyle_string();

  system("pause");
  return 0;
}

void cpp_string()
{
  string fName, lName;
  char grade;
  int age;

  cout << "What is your first name?";
  getline(cin, fName);
  cout << "What is your last name?";
  getline(cin, lName);
  cout << "What letter grade do you deserve?";
  cin >> grade;
  cout << "What is your age?";
  cin >> age;

  cout << "Name: " << fName << ", " << lName << endl;
  cout << "Grade: " << grade << endl;
  cout << "Age: " << age << endl;

  return;
}

void cstyle_string()
{
  char fNm[20], lNm[20];
  char grade;
  int age;

  cout << "What is your first name?";
  cin.get(fNm, 20).get();
  cin.clear();
  cout << "What is your last name?";
  cin.get(lNm, 20).get();
  cout << "What letter grade do you deserve?";
  cin >> grade;
  cout << "What is your age?";
  cin >> age;

  cout << "Name: " << fNm << ", " << lNm << endl;
  cout << "Grade: " << grade << endl;
  cout << "Age: " << age << endl;

  return;
}

我得到的输出是

What is your first name?demiurge conon  
What is your last name?no  
What letter grade do you deserve?a  
What is your age?22  
Name: demiurge conon, no  
Grade: a  
Age: 22  
What is your first name?What is your last name?What letter grade do you deserve?What is your age?Name: ,  
Grade: ╠ 
Age: -858993460 
Press any key to continue . . . 

但如果我在不同的文件中运行cstyle_string(),那么我不会收到任何错误代码可以完美运行。

我想知道为什么会这样?

【问题讨论】:

  • 您正在呼叫cpp_string()cstyle_string()。一次只能调用一个。因为他们消耗输入。
  • 它们都在不同的时间运行......我的意思是首先 cpp_string() 将运行,然后在它返回后,cstyle_string() 将运行。当我没有在 cpp_string() 中使用 cin.get() 时,它运行良好。在此之前,我使用 cin>>fname 进行输入,效果很好,但只需要一个单词,所以我使用 get() 来获取一行字符。现在代码不工作了。

标签: c++


【解决方案1】:

有两个问题。

  1. 冗余\n

  2. cin的状态

cpp_string 中的最后一个cincin &gt;&gt; age

它会留下一个\n 未被提取。

cstyle_string 的第一个是cin.get(fNm, 20).get();

如果找到分隔符,则不会从输入序列中提取,而是保留在那里作为要从流中提取的下一个字符

cin.get(FNm, 20) 将在\n 之前解析空输入,实际上流中没有可用的字符。在这种情况下,failbit 标志将被设置,接下来所有的cin &gt;&gt; 运算符都将失败。

你只能打电话cstyle_string直接回车,会发生同样的事情。

【讨论】:

  • 谢谢,新行必须被忽略。所以使用了这一行 cin.ignore(numeric_limits::max(),'\n');在 cstyle_string() 中的第一个 cout 之前,现在它工作正常。
猜你喜欢
  • 1970-01-01
  • 2016-11-27
  • 1970-01-01
  • 1970-01-01
  • 2017-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-22
相关资源
最近更新 更多