为什么两个getline()会导致没有输入?

2022-01-30 07:09:46 标签 c++inputiostreamgetline

我正在创建一个简单的登录程序。

#include <iostream>
#include <string>
using namespace std;    
void showRegister()
{
    string user;
    string pw;
    cout << "Enter your username:";
    getline(cin, user);
    cout << "Enter your password:";
    getline(cin, pw);
    cout << "You have successfully registered!" << endl;
    writeIntoFile(user, pw);
    showMenu();
}
void showMenu() {
    int select;
    do {
        cout << "1. Register"<<endl;
        cout << "2. Login" << endl;
        cout << "3. Exit" << endl;
        cout << "Enter your choice: ";
        cin >> select;
    } while (select > 3);
    switch (select)
    {
    case 1:
        showRegister();
        break;
    case 2:
        showLogin();
        break;
    case 3:
    default:
        break;
    }
}
int main()
{
    showMenu();
    return 0;
}

这是我选择1的结果:

如你所见,我不能输入用户名。在函数showRegister()中,当我在getline(cin user)之前添加cin。ignore()时,结果如下:

正如我所理解的,getline()读取一行直到字符n,然后跳过其余的。那么为什么在这种情况下,两个连续的getline()命令(getline(cin user)和getline(cin pw)导致我不能输入用户名?

事实上,getline从buffer中获取输入,如果有东西在buffer中,它会询问用户值。在你的代码中实际发生的是,一旦你为select输入的值不大于3,它就会从循环中出来,在你为select输入的值之后,你按下的值(代表\n)被存储在缓冲区中。所以你知道什么时候来getline用户认为“\ n”从缓冲getline首先检查缓冲区,跳过插入值和缓冲区被清空,现在当你来到getline用于密码它要求用户密码作为缓冲是空的。

这总是发生在从格式化输入切换到非格式化输入之后。从std::cin >> select to std::getline

std::getline

格式化的输入将读取您的整数“选择”,但不是以下CR LF。(你按了回车键)。

要解决这个问题,你可以简单地写:

Std::ws将首先消耗前导空格。然后,std::getline将按预期工作。

    getline(cin >> std::ws, user);

请阅读这里关于std::ws,不要忘记包括<iomanip>;

您的代码中还有更严重的错误。比如对showMenu的循环调用

阅读全文

▼ 版权说明

相关文章也很精彩
推荐内容
更多标签
相关热门
全站排行
随便看看

错说 cuoshuo.com —— 程序员的报错记录

部分内容根据CC版权协议转载;网站内容仅供参考,生产环境使用务必查阅官方文档

辽ICP备19011660号-5

×

扫码关注公众号:职场神器
发送: 1
获取永久解锁本站全部文章的验证码