3

質問があいまいではないことを願っています。

私が尋ねるとき:

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にアスキーアートが描かれています.x、yでステートメントを数えると、入力された12文字を超えるものはアスキーアートの上に描画されます。

これが理にかなっているといいのですが:'{ ありがとうございます!

4

3 に答える 3

9

デフォルトでは、コンソールはクック モード(標準モード、ライン モードなど) です。これの意味は

  1. コンソール ドライバがデータをアプリケーションに渡す前にバッファリングしていること
  2. 文字は、コンソール ドライバーによって自動的にコンソールにエコー バックされます。

通常、これは、行が終了した後、つまりエンターが押されたときにのみ、プログラムが入力を取得することを意味します。自動エコーのため、それらのキャラクターはすでに画面に表示されています。

両方の設定は個別に変更できますが、メカニズムは -- 残念ながら -- OS 固有の呼び出しです。

ウィンドウの場合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非エコー_getch()(アンダースコア付き) を含めて提供しています。いつでもそれを使用して、手動で文字をエコーすることができます。_getch()コンソールラインモードのオン/オフ、エコーのオン/オフスイッチを関数にラップするだけです。

編集:ここでは、の使用例を示すことを意図してい_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);
于 2015-09-01T07:49:10.737 に答える
0

scanf("%c",&character)1 から 12 までのループで使用して、それらを事前に割り当てられたバッファーに追加できます。

于 2015-09-01T07:38:26.073 に答える
0

私のコメントのように、_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 という文字列に連結しながら、押されたキーを押すたびにカウントできます。

その後、これを使用するプログラムで、フルネームを単一の文字列タイプとして表示できます。

于 2015-09-03T06:56:18.117 に答える