2013-07-01 111 views
2

請確保您使用的是OSX!在OSX上不輸入密碼鑰匙

GCC信息:

使用內置的規格。 目標:i686-apple-darwin11 配置爲:/private/var/tmp/llvmgcc42/llvmgcc42-2336.11~28/src/configure --disable-checking --enable-werror --prefix =/Applications/Xcode.app /Contents/Developer/usr/llvm-gcc-4.2 --mandir =/share/man --enable-languages = c,objc,C++,obj-C++ --program-prefix = llvm- --program-transform-name =/^ [cg] [^ .-] * $/s/$/- 4.2/--with-slibdir =/usr/lib --build = i686-apple-darwin11 --enable-llvm =/private/var /tmp/llvmgcc42/llvmgcc42-2336.11~28/dst-llvmCore/Developer/usr/local --program-prefix = i686-apple-darwin11- --host = x86_64-apple-darwin11 --target = i686-apple-darwin11 --with-gxx-include-dir =/usr/include/C++/4.2.1 線程型號:posix gcc版本4.2.1(基於Apple Inc. build 5658)(LLVM build 2336.11.00)

我想要得到一個字符從按鍵並顯示它。我試圖在沒有Curses庫的情況下這樣做(將用於Android和OSX等,我不想移植)。基於另一篇文章,我想出了下面....

#include <stdio.h> 
#include <termios.h> 
#include <time.h> 
#include <string.h> 

static char ch; 
void getkey() { 
    struct termios orig_term_attr; 
    struct termios new_term_attr; 

    /* set the terminal to raw mode */ 
    tcgetattr(fileno(stdin), &orig_term_attr); 
    memcpy(&new_term_attr, &orig_term_attr, sizeof(struct termios)); 
    new_term_attr.c_lflag &= ~(ECHO|ICANON); 
    new_term_attr.c_cc[VTIME] = 0; 
    new_term_attr.c_cc[VMIN] = 0; 
    tcsetattr(fileno(stdin), TCSANOW, &new_term_attr); 

    /* read a character from the stdin stream without blocking */ 
    /* returns EOF (-1) if no character is available */ 
    char test = fgetc(stdin); 
    if(test != -1) 
    printf("Value is : %c \n",test); 
    ch = test; 
    /* restore the original terminal attributes */ 
    tcsetattr(fileno(stdin), TCSANOW, &orig_term_attr); 
} 

int main() 
{ 
    do 
    { 
    getkey(); 
    int ch2 = (int) ch; 
    if(ch2 != -1){ 
     printf("%c \n",ch); 
    } 
    }while(1==1); 
} 

但是,這似乎並沒有清除緩衝區,所以當我鍵入一個則B的C我看到...

aababc

這是目前正在編譯並在我的OSX與海灣合作委員會的命令框tect.c運行和./a.out

我想它是ABC

+0

你看到什麼沒有多大意義......你有兩個'printf'語句,它們都放置空格和回車。你怎麼能通過鍵入「abc」有這樣的輸出? –

+0

如果你「不想移植」,編寫非常系統特定的代碼可能是不可行的。 –

+0

我不想編寫系統特定的代碼,我會願意接受更通用的答案。這是我迄今爲止所能想到的。最終目標是在問題中要求在任何平臺上實時捕獲按鍵。隨意回答與我不相似的代碼。我把OSX放在標題中純粹是因爲我知道它在ubuntu上工作。 – Jackie

回答

1

你的代碼的作品,但你打印字符兩次:

printf("Value is : %c \n",test); 
printf("%c \n",ch); 

我試着自己:

Value is : a 
a 
Value is : b 
b 
Value is : c 
c 
Value is : d 
d 

順便說一句,你不應該使用全局變量,但返回鍵代替。 ..

+0

仍然無法在我的機器上運行,您是否在OSX上運行?什麼版本... – Jackie

+0

Debian Linux與GCC 4.7。當你輸入「abc」時你究竟有什麼?你有和我不一樣的東西嗎? –

+0

並不意味着downvote – Jackie