我正在寻找一种使用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
属性。
答案 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();
}
这可能会使用一些调整,因为它绝对不是完美的,但我认为这很容易理解,至少我希望如此