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...