linux下退格鍵的小研究
阿新 • • 發佈:2019-02-04
最近在linux下寫程式碼的時候出現一個很奇怪的問題。程式碼中有一段大概是這樣的,單獨抽出來如下:
#include <stdio.h>
#define LEN 30
int main()
{
char string[LEN];
puts("input string\n");
scanf("%s",string);
puts("output string\n");
printf("%s\n",string);
}
大家肯定說這段程式碼很好讀懂啊,不就是讀入一行在輸出一行嗎,這能出什麼問題,還真就出了一個不大不小的問題,在退格鍵上。執行後如下:
注意到沒,退格鍵變成了^H,而且沒起到刪除字元的作用, ,那退格鍵的作用是啥?還是編譯器的問題?windows下用VC6.0跑了一下,沒有這個問題,看來不是作業系統的問題就是編譯器的問題,個人覺得作業系統的原因可能性更大。不會是C語言自身的問題吧,雖然明知不可能,但是本著科學的精神,還是試了一下,C他哥C++,程式碼如下:
果然問題依然存在。#include <iostream> #include <string> using namespace std; int main() { string ch; cout<<"input string:"<<endl; cin>>ch; cout<<"output string:"<<endl; cout<<ch<<endl; return 0; }
那退格鍵到底有什麼作用呢?這個問題還真的從來沒研究過。
printf("hello\b\b\n");
什麼也沒發生,螢幕對我說了句hello,就跑掉了。
不可能,C不是這麼絕情的孩子,絕對發生了什麼。
printf("hello\b\b \n");
程式碼改成上面這樣,退格後又輸出兩個空格,再換行,這次,輸出變成了hel。我就知道一定發生了什麼!機智如我,所以,僅僅是游標發生了移動,然後用空格覆蓋了lo。
知道了原因,怎麼改程式碼呢,挨個字元讀吧,就不能圖省事了。
檢測到一個退格,就往前面一個扔一個\0,方法粗暴有效。#include <stdio.h> #define LEN 30 void get_string(char * string, int len) { char ch; int i=0; while((ch=getchar())!='\n' && i<len-2 && i>=0 ) { if(ch=='\b') string[--i]='\0'; else string[i++]=ch; } string[i]='\0'; } int main() { char string[LEN]; get_string(string,LEN); printf("%s\n",string); return 0; }
但是輸入流裡依然有難看的^H,查了點資料,按住ctrl+backspace,就能起到在輸入流裡刪掉字元的作用,還是感覺很難受啊,windows裡明明只要按一個鍵,linux裡卻要按兩個。
如果要繼續研究下去的話,恐怕就要看linux的底層程式碼了,作為一個小白,研究大概也就只能到此為止了。