實現乙個簡單的行編輯器

2022-09-17 13:57:24 字數 4044 閱讀 9025

1.要求

2.開啟、關閉回顯和緩衝

3.顯示大小寫字母和數字

4.實現退格鍵

5.實現游標左右移動

6.實現del鍵刪除整行

7.總**

,但是行編輯器不能讓每個字元都輸出在螢幕上,有些鍵是要作為功能鍵來使用的,所以必須關閉回顯設定,讓我們自己來設計有選擇的輸出字元。

二是在linux命令列的預設模式下,輸入字元後必須按回車才能把緩衝區字元送到程式那裡去執行,所以必須開啟立即響應模式,只要使用者按下了鍵就立刻響應乙個功能。

以下是具體**:

我把開啟、關閉回顯和緩衝封裝成為了乙個函式void fun_set(struct termios *info, char set);

set設定為0就是關閉,設定為1就是開啟。

在執行迴圈**之前開啟,迴圈**之後關閉,這樣就不會影響terminal的正常使用了。

/* 設計完成乙個行編輯器

* 開啟、關閉回顯和緩衝

*/#include #include #define oops(s, x)

void fun_set(struct termios *info, char set);//設定回顯位,設定緩衝

int main()

fun_set( &info, 1 );//開啟回顯位,開啟緩衝

}void fun_set(struct termios *info, char set)

else

if ( tcsetattr(0, tcsanow, info) == -1 ) /* set attribs */

oops("tcsetattr",2);

}

想要顯示大小寫字母和數字,只需要在while函式中判斷一下是不是大小寫字母和數字,是的話就輸出在螢幕上,不是的話就跳過。

while( ( c=getchar() ) != eof )

}

isalnum()函式判斷是不是乙個數字或字母,然後通過putchar列印出字元即可。

在這裡可以通過乙個陣列來儲存這些輸出的字元,這樣當你在之後想儲存到檔案中去的時候也會更方便。

char str[30];//儲存輸出的字元

int p = 0;//當前位置

while( ( c=getchar() ) != eof )

}

退格鍵的實現其實是非常簡單的。

當你按下退格鍵的時候,程式實際上執行了三條指令:

1.putchar('\b');//將游標左移

2.putchar(' ');//輸出乙個空字元

3.putchar('\b');//將游標左移

什麼意思呢?其實就是先將游標移動到左邊,然後輸出乙個空字元將原來的字元覆蓋掉,這樣就相當於把左邊的字元刪掉了,但是此時游標還停留在空字元的右邊。

比如原來是輸入了helloworld:

然後執行putchar('\b');putchar(' ');就變成了:

這時候再執行乙個putchar('\b');

將退格鍵封裝成乙個函式void fun_backspace():

void fun_backspace()

因為退格鍵的ascii碼為十六進製制的0x7f,所以while迴圈裡**為:

while( ( c=getchar() ) != eof )

else if( c == 0x7f )

}

這樣就實現了退格鍵的功能,但是程式還有乙個小bug:就是當所有字元都刪完了之後,你還是可以按退格鍵。雖然這時候退格鍵已經沒有刪任何字元了,但是在之後還是會帶來一些小的隱患。

所以為了解決這個問題,我們引入字元陣列的長度len,讓len記錄字元陣列的長度,當len大於0的時候,可以執行退格鍵

char str[30];//儲存輸出的字元

int p = 0;//當前位置

int len = 0;//總長度

while( ( c=getchar() ) != eof )

else if( c == 0x7f )}}

可以簡化為:

else if( c == 0x7f && len )

因為方向鍵上下左右在實際測試中發現,其實是由三個字元組成的,實現起來需要一些特殊的方法。所以在這裡先用'[

else if ( c == ']' && p < len )

這裡用p來代表當前游標所在的位置。

同樣,當游標已經移到最左邊的時候,就不執行左移鍵了;當游標已經移到最右邊的時候,也不執行右移鍵了。

到這裡,也就實現了左移右移游標的功能了。

但是!如果就到這裡結束了的話,那麼程式會有很大的bug!比如說當你移動游標到helloworld的w上的時候:

再執行退格鍵,那麼就會發現是這樣的:

你會發現刪除了乙個字元後整個顯示的字元陣列都會亂掉。

如果在這個時候還輸入一些大小寫字母或者數字,你就會發現情況會變得更亂。

那麼怎麼解決這個問題呢?

那就是分別在顯示字元的地方和實現退格的地方加入一些**來實現這些功能。

首先在while迴圈外面定義int i, j;來輔助我們工作。然後是處理輸出大小寫字母和數字的函式:

if( isalnum(c) )

然後是解決中間退格的問題:

else if( c == 0x7f && p )

//2.將最後乙個元素刪除

putchar(' ');

putchar('\b');

len--;

p--;

//3.將游標移動到之前的位置

while( j-- > 0 && p-- )

putchar('\b');

}

實現del鍵刪除整行的思路其實很簡單:

首先將游標移動到尾部,然後只要len大於0,就迴圈執行退格鍵。這樣就能夠將整行刪除了。

ps:del鍵的ascii碼為十六進製制的0x7e,所以while迴圈裡**為:

else if ( c == 0x7e && len )

/* 設計完成乙個行編輯器

* 能夠接受使用者輸入,能倒退刪除,插入,移動游標等

*/#include #include #define oops(s, x)

void fun_set(struct termios *info, char set);//設定回顯位,設定緩衝

void fun_backspace();//實現退格功能

int main()

else if( c == 0x7f && p )

//2.將最後乙個元素刪除

putchar(' ');

putchar('\b');

len--;

p--;

//3.將游標移動到之前的位置

while( j-- > 0 && p-- )

putchar('\b');

}else if ( c == '[' && p )

else if ( c == ']' && p < len )

else if ( c == 0x7e && len )

}fun_set( &info, 1 );//開啟回顯位,開啟緩衝

}void fun_set(struct termios *info, char set)

else

if ( tcsetattr(0, tcsanow, info) == -1 ) /* set attribs */

oops("tcsetattr",2);

}void fun_backspace()

實現乙個簡單的行編輯器(優化)

1.前言 2.使用方向鍵來實現游標左右移動 3.按兩下esc鍵退出程式 4.移動游標到行首 5.移動游標到行尾 6.總 之前已經寫過一篇文章了 實現乙個簡單的行編輯器 實現的功能有 1.按下大小寫字母或者數字的時候,顯示在螢幕上 2.可以使用退格鍵來刪除前乙個字元 3.可以使用del鍵來刪除一行 4...

寫乙個簡單的技能編輯器(前言)

還有大叔的這篇也有參考價值 本人分享這個的初衷是經歷了一次直接強擼類arpg遊戲的痛苦,策劃直接給不確定的需求,美術不經過策劃直接給資源給程式,然後程式就是一邊要和策劃確定和執行策劃需求,一邊還要和美術對相應的美術資源,不行再返工,浪費了太多了專案時間,這就造成了中間策劃和美術的一些溝通的架空,本人...

行編輯器的簡易C 實現

說到行編輯器的實現,其實還是主要運用棧的結構特點,具體理論參考 資料結構 嚴蔚敏著 實現 如下 include using namespace std define max size 100 void lineeditor char c1,int length else if c1 i else i...