我正在撰寫代碼,無需用戶按 ENTER 即可獲得輸入。該代碼基本上是我需要從 1-6 中獲取 4 個數字,而無需用戶在一行中全部按下 ENTER。
我嘗試用 這樣做getchar(),但它不起作用。
我怎么做?
這是代碼的那部分:
int p1 = 0;
int p2 = 0;
int p3 = 0;
int p4 = 0;
p1 = getchar() - 48;
p2 = getchar() - 48;
p3 = getchar() - 48;
p4 = getchar() - 48;
uj5u.com熱心網友回復:
這是一個 C 常見問題解答:12.5 如何一次讀取一個字符,而無需等待 RETURN 鍵?
去參考:
根據您使用的作業系統和可用的庫,您可以使用以下一種(或多種!)技術:
- 如果可以使用curses庫,則可以呼叫cbreak [footnote](也可能是noecho),之后呼叫getch 將立即回傳字符。
- 如果您嘗試做的只是在沒有回顯的情況下讀取短密碼,那么您可以使用名為 getpass 的函式(如果可用)。(隱藏鍵入的密碼的另一種可能性是在黑色背景上選擇黑色字符。)
- 在經典版本的 Unix 下,使用 ioctl 以及檔案描述符 0 上的 TIOCGETP 和 TIOCSETP(或 TIOCSETN)請求來操作 sgttyb 結構,該結構在 <sgtty.h> 中定義并記錄在 tty(4) 中。在 sg_flags 欄位中,設定 CBREAK(或 RAW)位,并可能清除 ECHO 位。
- 在 System V Unix 下,使用檔案描述符 0 上的 ioctl 以及 TCGETAW 和 TCSETAW 請求來操作 <termio.h> 中定義的 termio 結構。在 c_lflag 欄位中,清除 ICANON(可能還有 ECHO)位。此外,將 c_cc[VMIN] 設定為 1,將 c_cc[VTIME] 設定為 0。
- 在提供 POSIX 兼容性的任何作業系統(Unix 或其他)下,使用檔案描述符 0 上的 tcgetattr 和 tcsetattr 呼叫來操作 <termios.h> 中定義的 termios 結構。在 c_lflag 欄位中,清除 ICANON(可能還有 ECHO)位。此外,將 c_cc[VMIN] 設定為 1,將 c_cc[VTIME] 設定為 0。
- 在緊要關頭,在 Unix 下,使用 system(參見問題 19.27)呼叫 stty 命令來設定終端驅動程式模式(如前三項)。
- 在 MS-DOS 下,使用 getch 或 getche,或相應的 BIOS 中斷。
- 在 VMS 下,嘗試螢屏管理 (SMG$) 例程或curses,或使用 IO$_READVBLK 函式代碼(可能還有 IO$M_NOECHO 和其他代碼)發出低級 $QIO 以一次請求一個字符。(也可以在 VMS 終端驅動程式中設定一次字符或“通過”模式。)
- 在其他作業系統下,您是靠自己的。
uj5u.com熱心網友回復:
對此沒有標準功能。
有一些自定義解決方案,例如https://www.cs.uleth.ca/~holzmann/C/system/ttyraw.c但您的里程可能會有所不同。
但是,如果終端的這種動態使用是您程式的核心,我建議使用 ncurses 或類似的東西。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/400281.html
標籤:C
