1. 程式人生 > >linux下退格鍵的小研究

linux下退格鍵的小研究

    最近在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。

    知道了原因,怎麼改程式碼呢,挨個字元讀吧,就不能圖省事了。

#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;
}
     檢測到一個退格,就往前面一個扔一個\0,方法粗暴有效。

    但是輸入流裡依然有難看的^H,查了點資料,按住ctrl+backspace,就能起到在輸入流裡刪掉字元的作用,還是感覺很難受啊,windows裡明明只要按一個鍵,linux裡卻要按兩個。

    如果要繼續研究下去的話,恐怕就要看linux的底層程式碼了,作為一個小白,研究大概也就只能到此為止了。