如何在使用std :: cin时限制可见的用户输入?

时间:2016-09-24 17:03:53

标签: c++ input user-input

我正在寻找一种使用std::cin限制可见用户输入的方法。

#include <iostream>
int main()
{
   std::cout << "Enter your planet:\n";
   string planet;
   std::cin >> planet; // During the prompt, only "accept" x characters
 }

用户在按Enter键之前输入earth或超过4个字符的任何其他字词时看到的内容:

Enter your planet:
eart

假设字符数限制为4,请注意'h'缺失。一旦超出字符限制,控制台不会显示任何其他字符。这是在你按下回车键之前。

有点像输入密码字段这样的输入框,但它只允许5个字符,因此输入任何其他字符都不会引起注意

更好的类比是HTML中文本输入的maxlength属性。

2 个答案:

答案 0 :(得分:3)

由于操作系统控制台不是C ++标准的一部分,因此无法轻松实现。在Windows中,您可以使用<windows.h>标题 - 它提供控制台句柄等,但由于您没有指定您正在使用的操作系统,因此在此处发布仅限Windows的代码是没有意义的(因为它可能不会满足您的需求。)

编辑:

以下是(非完美)代码,它将限制用户的可见输入:

#include <iostream>
#include <windows.h>
#include <conio.h>
int main()
{
    COORD last_pos;
    CONSOLE_SCREEN_BUFFER_INFO info;
    std::string input;
    int keystroke;
    int max_input = 10;
    int input_len = 0;
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);

    std::cout << "Input (max 10) characters, press ENTER to prompt:" << std::endl;

    GetConsoleScreenBufferInfo(handle, &info);
    last_pos = info.dwCursorPosition;

    while(true)
    {
        if(kbhit())
        {
            keystroke = _getch();
            //declare what characters you allow in input (here: a-z, A-Z, 0-9, space)
            if(std::isalnum(keystroke) || keystroke == ' ') 
            {
                if(input_len + 1 > max_input)
                    continue;

                ++input_len;

                std::cout << char(keystroke);
                input += char(keystroke);

                GetConsoleScreenBufferInfo(handle, &info);
                last_pos = info.dwCursorPosition;
            }
            else if(keystroke == 8) //backspace
            {
                if(input_len - 1 >= 0)
                {
                    --input_len;
                    input.pop_back();

                    COORD back_pos {short(last_pos.X-1), last_pos.Y};

                    SetConsoleCursorPosition(handle, back_pos);
                    std::cout << ' ';
                    SetConsoleCursorPosition(handle, back_pos);

                    GetConsoleScreenBufferInfo(handle, &info);
                    last_pos = info.dwCursorPosition;
                }
            }
            else if(keystroke == 13) //enter
            {
                std::cout << std::endl;
                break;
            }
        }
    }

    std::cout << "You entered: " << std::endl
              << input << std::endl; 
}

答案 1 :(得分:0)

经过几天的实验,我发现了另一个似乎很容易掌握的解决方案,因为它有点初学者水平,并且不需要任何Windows编程知识。

注意: 可以使用conio.h函数轻松替换_getch()库函数getchar();

我不是说以前的答案不合适,但这个解决方案只针对那些只具备基本知识的初学者c++

char ch;
string temp;
ch = _getch();
while(ch != 13)// Character representing enter
{
    if(ch == '\b'){ //check for backspace character
       if(temp.size() > 0) // check if string can still be reduced with pop_back() to avoid errors
       {
          cout << "\b \b"; //
          temp.pop_back(); // remove last character
        }
     }
    else if((temp.size() > 0)  || !isalpha(ch))// checks for limit, in this case limit is one
    {                                         //character and also optional checks if it is an alphabet
        cout << '\a'; // for a really annoying sound that tells you know this is wrong
    }else {
        temp.push_back(ch); // pushing ch into temp
        cout << ch; // display entered character on screen
    }
    ch = _getch();
}

这可能会使用一些调整,因为它绝对不是完美的,但我认为这很容易理解,至少我希望如此