2014-11-13 6 views
2

저는 C++로 텍스트 기반 게임을 작성하고 있습니다. 어떤 시점에서 나는 다른 플레이어가 연주하는 것에 해당하는 사용자 이름을 입력하도록 사용자에게 요청합니다.C++에서 ncurses로 문자열 읽기

나는 현재과 같이 ncurses의에서 하나의 문자를 읽고 있어요 :

move(y,x); 
printw("Enter a char"); 
int char = getch(); 

는 그러나, 나는 어떻게 문자열로 확실하지 않다. 내가 좋아하는 뭔가를 찾고 있어요 : 나는 다른하지 않는 기능의 다른 세트를 사용하여 ncurses의 모든 사용을위한 다양한 가이드를 본 적이

move(y,x); 
printw("Enter a name: "); 
std::string name = getstring(); 

. 지금까지 deprecated 함수와 non-deprecated 함수 사이의 줄을 잘 정의 할 수는 없습니다.

+1

http://invisible-island.net/ncurses/man/curs_getstr.3x.html – indiv

답변

4

어때?

std::string getstring() 
{ 
    std::string input; 

    // let the terminal do the line editing 
    nocbreak(); 
    echo(); 

    // this reads from buffer after <ENTER>, not "raw" 
    // so any backspacing etc. has already been taken care of 
    int ch = getch(); 

    while (ch != '\n') 
    { 
     input.push_back(ch); 
     ch = getch(); 
    } 

    // restore your cbreak/echo settings here 

    return input; 
} 

대체 *scanw() 기능 패밀리를 사용하지 않는 것이 좋습니다. 임시 char [] 버퍼를 처리하고 모든 문제가있는 기본 *scanf() 기능과 함께 *scanw() 사양의 경우 스캔 한 항목 수 대신 ERR 또는 OK을 반환하므로 유용성이 줄어 듭니다.

(사용자 개별 선택에 의해 제안) getstr()*scanw()보다 더 나은 모양과 기능 키의 특수 처리가, 여전히 임시 char [] 필요하지, 난, C++ 코드에서이를 피하려고하지만 경우에 아무것도하지만, 어떤 임의의를 피하기위한 버퍼 크기.

+0

'UTF-8'로 작업하지 않으면 코드가 작동합니다. 우리가 주목했듯이,'ch = getch();'와'input.push_back (ch);'를 실제로 사용하는 것은 1 char가 아니라 2입니다. 그리고 우리가 deliting 할 때, 그들은 1을 1만큼 삭제합니다. 화면에서 1 문자를 지우는 것을 의미하기 때문에,'del' 버튼을 두 번 눌러야합니다. 어떻게 해결할 수 있습니까? –

+0

@AndrewKusachev : nwcurses는 ncurses에 대한 와이드 문자 확장입니다. – DevSolar

+0

'-lncursesw' 플래그로 코드를 컴파일 중이지만 여전히 실수입니다 : 2 회는'del' 키를 눌러 문자를 삭제합니다 –