CMD 提示符 C++:限制在屏幕上输入的文字
CMD Prompt C++: Limiting literals entered on screen
我希望这个问题不会模棱两可。
当我问:
int main()
{
string name = {""};
cout << "Please enter a name: " << endl;
getline(cin, name);
//user enters 12 characters stop displaying next literal keypresses.
enter code here
}
我希望能够限制用户在屏幕上输入字符的次数。例如,屏幕停止显示长度为 12?
的字符
如果是这样,执行此类操作的库和命令行是什么?
想要这样,我在 CMD 上绘制了一个 ascii 艺术,当我在 x 处计算语句时,y 任何超过 12 个字符的长输入都会绘制在 ascii 艺术上。
我希望这是有道理的:'{ 谢谢!
您可以在从 1 到 12 的循环中使用 scanf("%c",&character)
,并将它们附加到预先分配的缓冲区。
默认情况下,控制台处于 cooked mode(规范模式、行模式...)。这意味着
- 控制台驱动程序在将数据传递给您的应用程序之前正在缓冲数据
- 字符将由控制台驱动程序自动回显到控制台
通常,这意味着您的程序只会在一行结束后获取输入,即当按下 enter 时。由于自动回显,这些字符已经出现在屏幕上。
这两个设置都可以独立更改,但机制是--不幸的是--一个OS特定的调用:
对于 Window 是 SetConsoleMode()
:
HANDLE h_stdin = GetStdHandle(STD_INPUT_HANDLE);
DWORD mode = 0;
// get chars immediately
GetConsoleMode(hStdin, &mode);
SetConsoleMode(hStdin, mode & ~ENABLE_LINE_INPUT));
// display input echo, set after 12th char.
GetConsoleMode(hStdin, &mode);
SetConsoleMode(hStdin, mode & ~ENABLE_ECHO_INPUT));
正如您自己所指出的,Windows 仍然提供 conio.h
including a non-echoing _getch()
(如今带有下划线)。您始终可以使用它并手动回显字符。 _getch()
简单地将控制台行模式 on/off、echo on/off 切换到一个函数中。
编辑: 这里有一个使用 _getch()
的例子。我有点忙于正确完成它,我没有发布可能有错误的代码。
在 *nix 下你很可能想要使用 curses/termcap/terminfo。如果你想要一个更精简的方法,低级例程记录在 termios/tty_ioctl:
#include <sys/types.h>
#include <termios.h>
struct termios tcattr;
// enable non-canonical mode, get raw chars as they are generated
tcgetattr(STDIN_FILENO, &tcattr);
tcattr.c_lflag &= ~ICANON;
tcsetattr(STDIN_FILENO, TCSAFLUSH, &tcattr);
// disable echo
tcgetattr(STDIN_FILENO, &tcattr);
tcattr.c_lflag &= ~ECHO;
tcsetattr(STDIN_FILENO, TCSAFLUSH, &tcattr);
在我的评论中,我提到了一个我使用 _getch() 想出的方法;和
手动显示每个字符。
简化版:
#include <iostream>
#include <string>
#include <conio.h>
using namespace std;
string name = "";
int main()
{
char temp;
cout << "Enter a string: ";
for (int i = 0; i < 12; i++) { //Replace 12 with character limit you want
temp = _getch();
name += temp;
cout << temp;
}
system("PAUSE");
}
这可以让你在按下时计算出每个按键,
同时将按下的每个字符连接到一个名为 name 的字符串。
然后以后在任何程序中使用它,您都可以将全名显示为单个字符串类型。
我希望这个问题不会模棱两可。
当我问:
int main()
{
string name = {""};
cout << "Please enter a name: " << endl;
getline(cin, name);
//user enters 12 characters stop displaying next literal keypresses.
enter code here
}
我希望能够限制用户在屏幕上输入字符的次数。例如,屏幕停止显示长度为 12?
的字符如果是这样,执行此类操作的库和命令行是什么?
想要这样,我在 CMD 上绘制了一个 ascii 艺术,当我在 x 处计算语句时,y 任何超过 12 个字符的长输入都会绘制在 ascii 艺术上。
我希望这是有道理的:'{ 谢谢!
您可以在从 1 到 12 的循环中使用 scanf("%c",&character)
,并将它们附加到预先分配的缓冲区。
默认情况下,控制台处于 cooked mode(规范模式、行模式...)。这意味着
- 控制台驱动程序在将数据传递给您的应用程序之前正在缓冲数据
- 字符将由控制台驱动程序自动回显到控制台
通常,这意味着您的程序只会在一行结束后获取输入,即当按下 enter 时。由于自动回显,这些字符已经出现在屏幕上。
这两个设置都可以独立更改,但机制是--不幸的是--一个OS特定的调用:
对于 Window 是 SetConsoleMode()
:
HANDLE h_stdin = GetStdHandle(STD_INPUT_HANDLE);
DWORD mode = 0;
// get chars immediately
GetConsoleMode(hStdin, &mode);
SetConsoleMode(hStdin, mode & ~ENABLE_LINE_INPUT));
// display input echo, set after 12th char.
GetConsoleMode(hStdin, &mode);
SetConsoleMode(hStdin, mode & ~ENABLE_ECHO_INPUT));
正如您自己所指出的,Windows 仍然提供 conio.h
including a non-echoing _getch()
(如今带有下划线)。您始终可以使用它并手动回显字符。 _getch()
简单地将控制台行模式 on/off、echo on/off 切换到一个函数中。
编辑: 这里有一个使用 _getch()
的例子。我有点忙于正确完成它,我没有发布可能有错误的代码。
在 *nix 下你很可能想要使用 curses/termcap/terminfo。如果你想要一个更精简的方法,低级例程记录在 termios/tty_ioctl:
#include <sys/types.h>
#include <termios.h>
struct termios tcattr;
// enable non-canonical mode, get raw chars as they are generated
tcgetattr(STDIN_FILENO, &tcattr);
tcattr.c_lflag &= ~ICANON;
tcsetattr(STDIN_FILENO, TCSAFLUSH, &tcattr);
// disable echo
tcgetattr(STDIN_FILENO, &tcattr);
tcattr.c_lflag &= ~ECHO;
tcsetattr(STDIN_FILENO, TCSAFLUSH, &tcattr);
在我的评论中,我提到了一个我使用 _getch() 想出的方法;和 手动显示每个字符。
简化版:
#include <iostream>
#include <string>
#include <conio.h>
using namespace std;
string name = "";
int main()
{
char temp;
cout << "Enter a string: ";
for (int i = 0; i < 12; i++) { //Replace 12 with character limit you want
temp = _getch();
name += temp;
cout << temp;
}
system("PAUSE");
}
这可以让你在按下时计算出每个按键, 同时将按下的每个字符连接到一个名为 name 的字符串。
然后以后在任何程序中使用它,您都可以将全名显示为单个字符串类型。