2015-09-25 31 views
3

我試圖從用戶獲取單個字符輸入,而用戶不必按Enter鍵。我已經試過這樣:獲取單個字符而不按輸入

#include <stdio.h> 

int main() { 
    int input; 

    for (;;) { 
     input = getchar(); 
     printf("%d\n", input); 
    } 
} 

但不是隻做用戶需要按下回車鍵,還註冊了兩個印刷機(輸入字符和換行符),即:

$ ./tests 
a 
97 
10 
c 
99 
10 

因爲我將總是期望從用戶輸入一個字符,並且希望該字符爲charint,如何在不等待\n的情況下獲得角色。

我也試過使用fgets,但因爲我在循環等待用戶輸入,只是連續執行printf而沒有阻塞,直到輸入。

我的預期輸出是:

a97 
b98 
... 

注:目前我在OSX,但我很高興,適用於任何OSX或Linux的解決方案。

+3

是什麼操作系統,你的工作就使用 讀(2)? – syntagma

+0

這是可能的,但我們正在超越標準C領域。要做到這一點取決於您的操作系統,所以我們需要了解您的操作系統才能繼續。 – fuz

+0

@ REACHUS更新! – Juicy

回答

2

我最近需要完全相同的功能,我已經在下面的方式來實現它:

#include <stdlib.h> 

char c; 

system("/bin/stty raw"); 
c = tolower(getchar()); 
system("/bin/stty cooked"); 

看着man stty,我覺得應該在Linux和Mac OS X上運行

編輯:所以你的程序看起來像(你需要的信號處理程序添加到它):

#include <stdlib.h> 
#include <stdio.h> 

int main() { 
    int input; 

    for (;;) { 
     system("/bin/stty raw"); 
     input = getchar() - '0'; 
     printf("%d\n", input); 
     system("/bin/stty cooked"); 
    } 
    return 0; 
} 
+0

此後,我的終端遇到了問題。 ( – merinoff

0

如果你想按只輸入一個命令結束時,您可以從文件描述符0

char buff[1025]; 

int ret = read(0, buff, 1024); 
buff[ret] = '\0'; 
+0

)爲什麼一個單一字符的1K buff?當read()返回-1時,它也會失敗 – Jens

+0

對不起,所以對於1個字符,只需在2處放置一個buff ..並保護if(ret = = -1) –