2011-09-09 2 views
2

).getline (cin, mystrvar)을 사용하여 사용자 입력을 읽는 동안 일부 컨트롤 키가 작동하지 않고 제어 키 (왼쪽 화살표)가 stdin (^ [[D])으로 전송됩니다 (

예 :

User input: abc^[[Dd 
Text: abd 
User input: asc 
Read bytes: 7 
#0: 97 
#1: 98 
#2: 99 
#3: 27 
#4: 91 
#5: 68 
#6: 100 

나는 A, B, C, 다음 왼쪽 화살표 D를 입력. "텍스트 :"처음 세 개의 문자를 쓴 (cout) 다음 포인터를 왼쪽으로 설정하고 c를 덮어 씁니다. "asc"는 길이 (mystrvar.size())와 ascii 값을 인쇄하는 간단한 함수입니다.

"stty -ctlecho"(시스템 (...))를 호출 할 때 왼쪽 화살표 키를 사용할 수 있지만 입력 한 내용에만 국한되지 않습니다. "사용자 입력 :"을 덮어 쓸 수 있습니다. 제어 코드는 여전히 내 프로그램으로 전송됩니다.

이것은 Windows에서는 발생하지 않습니다. 일반적으로 화살표 키 (기록의 위/아래)를 사용할 수 있습니다.

여기에 무슨 문제가 있습니까?

편집 : 나는 주로 lxterminal, 터미널, xterm 등, konsole 바로, 그놈 터미널 (터미널) 또는 bash는, KSH, tcsh가 (쉘 등의 차이가있는 것 같지 않습니다 페도라 15을 사용하고 있습니다).

답변

2

이러한 키가 작동하는 방식은 C++ 프로그램이 아니라 터미널의 속성입니다. 프로그램은 입력 라인을 버퍼링하고, 터미널은 그 라인을 어셈블해야한다.

+0

그래서 어떻게 든 터미널을 구성해야합니까? 내가 어떻게 그럴 수 있니? – basic6

+1

@ basic6'rlwrap'은'readline' 기능을 가능하게하는 간단한 도구입니다. 어쩌면 당신의 플랫폼에서 사용할 수 있습니다. –

+0

@ basic6 : 내가 사용하는 단말기가 무엇인지조차 알지 못하기 때문에, 나는 조금이라도 생각하지 못했습니다. 그것은 어쨌든 추가적인 질문이 될 것입니다. 그리고 아마도 SO에 있지 않고 아마도 터미널의 고급 설명서를 읽은 후에야 가능할 것입니다. – PlasmaHH

0

PlasmaHH가 맞습니다.이 키를 처리하는 방법은 터미널에 따라 다릅니다. 하지만 : 쉘 인터프리터도 그 역할을합니다.

그래서 쉽게 제안 : 마지막 ;-)

그냥 발사 "bash는"나의 컴퓨터에 (기본적으로 제대로 그 열쇠를 처리하고 다시 시도 사용 "bash는".

+0

나는 이미 그 (그리고 ksh)를 시도했다 - 어떤 차이도없는 것 같다. (만약 차이가 있다면, 나는 주로 Fedora를 사용하고있다.) – basic6

+0

그것은 또한 당신이 프로그램을 시작한 방법에 의존 할 수 있습니다. exec를 사용하면 쉘 프로세스를 뛰어 넘을 것입니다 ... 그가 리눅스 시스템에 연결하기 위해 퍼티를 사용하고 있으며, 모든 것이 엉망이되고 있습니다. – PlasmaHH

+0

저는 아닙니다. PuTTY (또는 다른 원격 연결)를 사용하여. – basic6

0

확인을 클릭하십시오.

누가 인라인 편집 기능을 제공한다고 생각하십니까? (뒤로 가기, 지우기, 등등을 누르기 전에 되돌릴 수있는 능력)

물론 프로그램이 아닙니다. 그래서 다른 프로그램이어야합니다. 어느 것 ? 쉘이 아니기 때문에 사용하고있는 콘솔을 말할 것입니다. 그것은 Windows cmd 프롬프트 가이 기능을 제공하는 것 같습니다. Linux 콘솔도이를 제공해야하지만, 비활성화되었거나 패킷이 필요합니다.

당신은 원격 연결을 사용하지 않는다고 말합니다. 하지만 어떤 콘솔을 사용하고 있습니까? "konsole"(kde console) 또는 시스템에있을 수있는 다른 변형을 시도해보십시오. 이 (즉, 표준 입력을 수신) 프로그램과 아무 상관이 지 않지만 그 특수 키를 해석 할 프로그램이없는 경우, 그들은 단지 입력 버퍼에 추가됩니다

...

+0

예, 알겠습니다. 내가 모르는 것은 단말기에 내 컨트롤 키를 보내는 대신 컨트롤 키를 해석하도록 터미널에 지시하는 방법입니다. 그리고 내가 얻지 못하는 이유는 그들이 어쨌든 프로그램에 보내진 이유입니다. 백 스페이스를 사용할 수는 있지만 되돌아 가서 DELETE를 사용할 수 없기 때문에 인라인 편집은 부분적으로 만 작동합니다. 나에게 의미가 없다 - 모든 것을 프로그램에 보내거나 제어 키를 해석한다. 그리고 후자는 불이행이어야합니다. 내가 틀렸다면 나를 바로 잡아주세요. 오, 나는 konsole을 시도했습니다. 똑같은 것입니다. – basic6

+0

글쎄, 당신이 그들을 시도 했으니 나는 제안에서 벗어났다. 나는 누군가가 대답을 찾으면 관심을 던진다. – Offirmo

0

, I '프로그램의 약간 다른 동작이 필요한 해결 방법을 찾았습니다.

#include <readline/readline.h> 
#include <readline/history.h> 

string blah() 
{ 
    string str; 

    cout << "User input (readline): "; 

    char *inp_c = readline(""); //Instead of getline() 

    str = (const char *)(inp_c); //Because C strings stink 

    //... 

    return str; 
} 

이것은 작동합니다. Windows에서 컴파일 할 수 없었습니다. 오류 : readline/readline.h : 해당 파일이나 디렉토리가 없습니다. 분명히 표준 헤더가 아니므로 먼저 설치해야합니다.

누구든지 더 좋은 방법을 알고 있다면 알려 주시기 바랍니다.