【问题标题】:My input is getting skipped no matter what I use无论我使用什么,我的输入都会被跳过
【发布时间】:2020-06-03 19:51:35
【问题描述】:

我试图让用户输入三个输入:用户名、ID 和备用 ID。如果用户输入用户名的返回,程序应该结束。如果用户输入用户名并为接下来的两个 id 输入返回值,则输入应显示为无效。我尝试过使用 cin、fgets 和 get(我知道 get 通常是糟糕的编程)。当我使用 cin 时,我尝试使用 cin.clear() 和 cin.ignore() 来跳过换行条目。第一个输入始终有效,但第二个输入调用不断被跳过。

代码sn-p:

int main(){
    string name, altID, tempUWFID;
    char input;
    cout << "Name> ";   
//  if (cin.get() == '\n') - This was one way that I tried.
    if ((input = getchar()) == '\n')
        break;
    else 
        cin >> name;
    cout << "UWF ID> ";
    if ((input = getchar()) != '\n')
        cin >> tempUWFID;
    cout << "Alternate ID> ";
    if ((input = getchar()) != '\n')
        cin >>altID;
cout << "\nThank you for abusing my program, have a nice day!\n";

输出:

Welcome to Voter's Registration
Name> johnny
UWF ID> Alternate ID>
ad
Invalid UWF ID

Name>

Thank you for abusing my program, have a nice day!

预期输出:

Welcome to Voter's Registration
Name> johnny
UWF ID> somenumber 
Alternate ID> someothernumber
Invalid UWF ID

Name>

Thank you for abusing my program, have a nice day!

【问题讨论】:

  • tl;dr 如果同时使用格式化和非格式化输入,你必须非常小心,否则你会被烧毁。
  • 考虑使用std::getline,然后检查提取的字符串是否为空。

标签: c++ input user-input cin


【解决方案1】:

这是我建立的一个快速的小程序,这能解决你的问题吗?

cin 本身可以读取换行符,cin &gt;&gt; ... 将换行符视为空格并忽略它们。 cin.getline(...)std::getline(cin, ...) 将从 cin 读取并丢弃换行符,然后停止读取。

所以看看这是否适合你。

#include <iostream>
#include <string>
using namespace std;

int main()
{
  string name = "";
  string uwfId = "";
  string altId = "";

  cout << "\nName> ";   
  getline(cin, name);
  if(name == "" )
    return 0;

  cout << "\nUWF ID> ";
  getline(cin, name);

  cout << "\nAlternate ID> ";
  getline(cin, name);

  if(uwfId == "" || altId == "")
  {
    cout << "\nInvalid!";
    return 1;
  }

  return 0;
}

【讨论】:

  • "我知道 cin 在换行符处停止" - 不,它没有。 getline() 停在换行符处。很大的区别。 cin 本身可以读取换行符,cin &gt;&gt; ... 将换行符视为空格并忽略它们。 cin.getline(...)std::getline(cin, ...) 将从 cin 读取并丢弃换行符,然后停止读取。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-27
  • 1970-01-01
  • 1970-01-01
  • 2023-02-01
  • 1970-01-01
  • 2021-06-05
相关资源
最近更新 更多