C语言字符界面,输入一串字符时可以随时按Esc键退出的工具函数

函数需求:

通常情况下,我们从键盘获取字符串使用的函数是 scanf()。
scanf() 这个函数有一个特点:当我们从键盘输入字符串时,它会先将我们输入的字符串存入一个缓冲区,当我们输入回车键时,再将缓冲区的字符写入到我们分配的内存中。
但这一特点在有些情况下很不适用。比如:我们实现一个字符界面时,若首先就要输入字符串,此处如果使用scanf()函数获取字符串,当用户不想输入了,想直接返回到上一个界面,此时用户必须先完成字符串的输入(用户必须按下回车键)才能返回上一级,这样的交互界面是很差的。

所以,我们换一个思路:
首先我们分配输入字符的缓冲区,从键盘每输入一个字符便判断一次:
当输入Esc键时,我们把缓冲区清零
当输入回车键时,我们把在缓冲区的最后加入字符串结束标志:‘\0’
当输入退格键时,我们将缓冲区的最后一位清除
判断完后,将键盘输入的字符回显到屏幕上。
这样我们就不仅实现了scanf()函数类似的功能,还能在输入字符串的过程当中随时退出输入。

具体实现:

/*
 * 函数功能:	输入一串字符时,可以随时按Esc键退出
 * 函数原型:	int  inputString (char  *buffer)
 * 参  数:		buffer: 字符类型指针,屏幕输入的字符的缓冲区
 * 返回值:    	1:从屏幕输入的字符串存放成功
 * 		        0:从屏幕输入的字符串存放失败
 */
int  inputString (char  *buffer)
{
	int  bufferIndex = 0;
	char   inputChar = 0;

	printf("Please enter your string: ");
	
	while (1) {
		inputChar = getch();                                    /*  单个字符输入  */ 
        
		if (inputChar == 27) {                                  /*  若是Esc键  */ 
			buffer[0] = '\0';                                   /*  字符缓冲区清空  */ 
			return  (0);                                        /*  返回输入失败标志  */ 
			
		} else if (inputChar == '\r' || inputChar == '\n') {    /*  若是Enter键  */ 
			buffer[bufferIndex] = '\0';                         /*  在字符缓冲区加入字符结束标志  */ 
			bufferIndex = 0;
			return  (1);                                        /*  返回输入成功标志  */
			
		} else if (inputChar == '\b') {                         /*  若是 BackSpace 键  */ 
			if (bufferIndex > 0) {                              /*  当缓冲区里存放有数据时  */ 
				bufferIndex--;                                  /*  清除字符缓冲区中最后一个字符  */ 
				printf("\b \b");                                /*  清除屏幕最近输入的字符  */ 
			}
			
		} else {
			buffer[bufferIndex++] = inputChar;                  /*  否则将得到的字符存入字符缓冲区  */
			putchar(inputChar);                                 /*  屏幕回显  */
		}
	}
}

/*  测试函数  */ 
int main() {
	char buf[50];
	int result = -1;
 
	result = inputString(buf);
	if (result) {
		printf("\nSeccuss!!!\n");
		printf("The string you entered is: %s\n", buf);
	} else {
		printf("\nFail!!!\n");
	}
 
	system("pause");
	return 0;
}

测试结果

1、输入成功:

Alt

2、取消输入:

Alt

  • 7
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值