2015-09-01 47 views
3

我希望問題不是模棱兩可。CMD提示C++:在屏幕上輸入的限制文字

,當我問:

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處聲明陳述時,任何超過12個字符的輸入都會吸引ascii藝術。

我希望這是有道理的:'{謝謝!

+0

標準C++庫中沒有這樣的東西。您需要編寫特定於平臺的代碼。 –

回答

0

您可以在一個循環中使用scanf("%c",&character)從1到12,並把它們添加到預先分配的緩衝區。

+2

不會scanf要求在每個字符後按Enter鍵? –

+0

你可以使用getch。或getchar –

+1

@KishanKumar'getchar()'有同樣的問題(需要輸入),'getch()'不是標準的。 –

9

默認情況下,控制檯是cooked mode(經典模式,行模式,...)。這意味着

  1. 它遞給你的應用程序
  2. 字符將通過控制檯驅動

通常會自動回顯到控制檯前,控制檯驅動程序緩存數據,這意味着你的程序只能在一行結束後獲得輸入,即當輸入時被按下。由於自動回顯,這些字符已經在屏幕上。

這兩種設置都可以獨立改變,但是其機制是--unfortunately--的操作系統特定的呼叫:

對於窗口是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()的例子。我有點忙於正確地完成它,我避免發佈潛在的錯誤代碼。

下,您很可能希望使用詛咒/的termcap/terminfo的* nix中。如果你想要一個更精簡的辦法,低級程序都記錄在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); 
+0

我通過包裝,//在if語句中禁用回聲,我應該能夠設置參數以在某個點停止回聲。 我確實設法使用_getch()然後添加連接它與一個空字符串,並有一個處理程序來重複_getch()直到ENTER被收到。 如果我設法在非常規方法中使用它,將會發布非常感謝:) –

+0

是的,我差點忘了['conio.h'](https://msdn.microsoft.com/en-us /library/7x2hy4cx.aspx)仍然存在。由於'_getch()'不會回顯,因此您可以始終手動回顯字符。 – dhke

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"); 
} 

這讓你清點每個按鍵如其所壓, 同時按下串聯爲一個字符串名爲名稱的每個字符。

然後在以後的程序中使用它,您可以將全名顯示爲單個字符串類型。

+0

您也可以在for循環語句之後注入特定按鍵以處理某些非法按鍵。 你也可以有一個if語句嵌套到for循環中來說,如果我> 11 temp = null;所以,它不會做任何事情。很像大多數輸入用戶名的文本字段。 –