无论我使用什么,我的输入都被跳过了

3
我试图让用户输入三个值:用户名,ID和备用ID。如果用户只输入用户名并回车,则程序应该结束。如果用户输入了用户名但在接下来输入ID时仅回车,则应显示无效输入。我尝试使用cin、fgets和get(我知道通常不建议使用get)等方法。当我使用cin时,我尝试使用cin.clear()和cin.ignore()跳过换行符。第一个输入始终有效,但第二个输入被跳过了。
代码片段:
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!

1
简而言之,如果您同时使用格式化和未格式化的输入,必须非常小心,否则您将会受到影响。 - Ayxan Haqverdili
1
考虑使用 std::getline 然后检查提取的字符串是否为空。 - Bob__
1个回答

3
这是我写的一个小程序,可以帮你解决问题吗?cin 本身可以读取换行符,而 cin >> ... 将换行符视为空格并忽略它们。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 >> ...将换行符视为空格并忽略它们。cin.getline(...)std::getline(cin, ...)将从cin中读取并丢弃换行符,然后停止读取。 - Remy Lebeau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接