函数需求:
通常情况下,我们从键盘获取字符串使用的函数是 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;
}