第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何避免使用getchar()按Enter

如何避免使用getchar()按Enter

C
慕森王 2019-06-17 15:58:43
如何避免使用getchar()按Enter在下一個代碼中:#include <stdio.h>int main(void) {      int c;      while ((c=getchar())!= EOF)           putchar(c);    return 0;}我得按下進入打印我輸入的所有信件getchar,但我不想這樣做,我想做的是按下這封信,立即看到我介紹的信沒有按下就重復了一遍進入..例如,如果我按下字母‘a’,我想看到它旁邊的另一個‘a’,依此類推:aabbccddeeff.....但是當我按“a”沒有發(fā)生任何事情時,我可以寫其他信件,只有當我按下時才會顯示副本。進入:abcdef abcdef我該怎么做?我正在使用命令cc -o example example.c在Ubuntu下編譯。
查看完整描述

3 回答

?
慕尼黑5688855

TA貢獻1848條經驗 獲得超2個贊

在linux系統(tǒng)上,可以使用stty命令。默認情況下,終端將緩沖所有信息,直到進入被按下,甚至在發(fā)送到C程序之前。

一個快速的、骯臟的、而且不是特別便攜的例子,可以從程序本身中改變行為:

#include<stdio.h>int main(void){
  int c;
  /* use system call to make terminal send all keystrokes directly to stdin */
  system ("/bin/stty raw");
  while((c=getchar())!= '.') {
    /* type a period to break out of the loop, since CTRL-D won't work raw */
    putchar(c);
  }
  /* use system call to set terminal behaviour to more normal behaviour */
  system ("/bin/stty cooked");
  return 0;}

請注意,這并不是最優(yōu)的,因為它只是假定stty cooked是程序退出時所希望的行為,而不是檢查原始終端設置。此外,由于在原始模式下跳過了所有特殊處理,所以許多關鍵序列(例如Ctrl-CCtrl-D)如果不顯式地在程序中處理它們,就不會像您期望的那樣工作。

你可以的man stty要獲得對終端行為的更多控制,完全取決于您想要實現(xiàn)的目標。


查看完整回答
反對 回復 2019-06-17
?
PIPIONE

TA貢獻1829條經驗 獲得超9個贊

這取決于您的操作系統(tǒng),如果您是在類似UNIX的環(huán)境中,默認情況下ICANON標志是啟用的,所以輸入被緩沖到下一個'\n'EOF..通過禁用規(guī)范模式,您將立即獲得字符。這在其他平臺上也是可能的,但是沒有直接的跨平臺解決方案。

編輯:我看到您指定使用Ubuntu。我昨天剛剛發(fā)布了類似的內容,但請注意,這將禁用您的終端的許多默認行為。

#include<stdio.h>#include <termios.h>            //termios, TCSANOW, ECHO, ICANON#include <unistd.h>    
 //STDIN_FILENOint main(void){   
    int c;   
    static struct termios oldt, newt;

    /*tcgetattr gets the parameters of the current terminal
    STDIN_FILENO will tell tcgetattr that it should write the settings
    of stdin to oldt*/
    tcgetattr( STDIN_FILENO, &oldt);
    /*now the settings will be copied*/
    newt = oldt;

    /*ICANON normally takes care that one line at a time will be processed
    that means it will return if it sees a "\n" or an EOF or an EOL*/
    newt.c_lflag &= ~(ICANON);          

    /*Those new settings will be set to STDIN
    TCSANOW tells tcsetattr to change attributes immediately. */
    tcsetattr( STDIN_FILENO, TCSANOW, &newt);

    /*This is your part:
    I choose 'e' to end input. Notice that EOF is also turned off
    in the non-canonical mode*/
    while((c=getchar())!= 'e')      
        putchar(c);                 

    /*restore the old settings*/
    tcsetattr( STDIN_FILENO, TCSANOW, &oldt);


    return 0;}

你會注意到,每個角色都會出現(xiàn)兩次。這是因為輸入立即回顯到終端,然后程序將其放回putchar()我也是。如果要將輸入與輸出分離,還必須轉回波標志。只需將適當的行更改為:

newt.c_lflag &= ~(ICANON | ECHO);


查看完整回答
反對 回復 2019-06-17
?
臨摹微笑

TA貢獻1982條經驗 獲得超2個贊

getchar()是一個標準函數,在許多平臺上要求您按Enter來獲取輸入,因為平臺緩沖輸入直到按下該鍵。許多編譯器/平臺支持不關心Enter的非標準Getch()(繞過平臺緩沖,將Enter視為另一個鍵)。


查看完整回答
反對 回復 2019-06-17
  • 3 回答
  • 0 關注
  • 1384 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號