linux下退格键的小研究

    最近在linux下写代码的时候出现一个很奇怪的问题。代码中有一段大概是这样的,单独抽出来如下:

#include 
#define LEN 30

int main()
{
	char string[LEN];
	puts("input string\n");
	scanf("%s",string);
	puts("output string\n");
	printf("%s\n",string);
}

    大家肯定说这段代码很好读懂啊,不就是读入一行在输出一行吗,这能出什么问题,还真就出了一个不大不小的问题,在退格键上。运行后如下:

linux下退格键的小研究_第1张图片

    注意到没,退格键变成了^H,而且没起到删除字符的作用,,那退格键的作用是啥?还是编译器的问题?windows下用VC6.0跑了一下,没有这个问题,看来不是操作系统的问题就是编译器的问题,个人觉得操作系统的原因可能性更大。不会是C语言自身的问题吧,虽然明知不可能,但是本着科学的精神,还是试了一下,C他哥C++,代码如下:

#include 
#include 

using namespace std;

int main()
{
    string ch;
	cout<<"input string:"<>ch;
	cout<<"output string:"<
    果然问题依然存在。

    那退格键到底有什么作用呢?这个问题还真的从来没研究过。

printf("hello\b\b\n");
    什么也没发生,屏幕对我说了句hello,就跑掉了。

    不可能,C不是这么绝情的孩子,绝对发生了什么。

printf("hello\b\b  \n");
   代码改成上面这样,退格后又输出两个空格,再换行,这次,输出变成了hel。我就知道一定发生了什么!机智如我,所以,仅仅是光标发生了移动,然后用空格覆盖了lo。

    知道了原因,怎么改代码呢,挨个字符读吧,就不能图省事了。

#include 
#define LEN 30

void get_string(char * string, int len)
{
	char ch;
	int i=0;
	while((ch=getchar())!='\n' && 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的底层代码了,作为一个小白,研究大概也就只能到此为止了。






你可能感兴趣的:(C/C++)