您的位置:首页 > 编程语言 > C语言/C++

C语言实现简单的打字程序

2018-03-20 11:57 1236 查看
/***********************************************
* 文件名:typeWroe.c
* 文件描述:实现简易的字符界面的打字程序-linux平台下
* 编写人: 王廷云
* 编写日期: 2017-10-17
* 修改日期: 2018-2-10
***********************************************/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

/* 按键输入枚举 */
enum input_e {
BACK,       // 退格
LEFT,       // 左键
RIGHT,      // 右键
NOMAL,      // 普通字符
UNKNOW,     // 特殊功能按键
};

/* 功能函数声明 */
int  getInput(char *dest, int *idx);
void showChar(char const *src, char *dest, int idx);
void deleteChar(char *dest, int *idx);

/*
* 程序从主函数开始
* 思路:
*   1.关闭系统默认的获取输入通道
*   2.使用字符数组保存用户输入的字符
*   3.打印字符并检查输入字符输入情况
*/
int main(void)
{
char src[] = "This is a simple typing program."; // 用于对照的字符串
char dest[100] = {0};  // 存储用户的字符
int idx = 0;           // 光标位置
int key;               // 用户输入

/* 初始化设置 */
system("stty -icanon"); // 关缓冲
system("stty -echo");   // 关回显
system("clear");        // 清屏

/* 显示对照字符串 */
fprintf(stdout, "%s\n", src);

/* 进入打字程序 */
while (1)
{
/* 获取输入 */
key = getInput(dest,&idx);

/* 根据不同输入进行不同操作 */
switch (key)
{
case BACK : deleteChar(dest,&idx);         break;
case LEFT : if (idx > 0) idx--;            break;
case RIGHT: if (idx < strlen(dest)) idx++; break;
default   : break;
}

/* 显示结果 */
showChar(src,dest,idx);

/* 打字结束 */
if (idx == sizeof(src)-1)
{
break;
}
}

/* 程序结束后的配置恢复 */
system("stty icanon"); // 恢复缓冲
system("stty echo");   // 恢复回显
fputc('\n', stdout);

return 0;
}

/*
* 函数名: getInput()
* 函数功能: 获取用户输入,普通字符保存在目标数组中
*           同时处理其它特殊字符:退格,回车,方向键
* 参数: 1.需要保存字符的目标数组; 2.光标位置
* 返回值: 返回用户输入对应的键值
*/
int getInput(char *dest, int *idx)
{
int key, i;
int len = strlen(dest);
char ch;

ch = getchar();

/* 方向键 */
if (ch == '\033' && getchar() == '[')
{
ch = getchar();
switch (ch)
{
case 'C': key = RIGHT;  break; // 左键
case 'D': key = LEFT;   break; // 右键
default : key = UNKNOW; break;
}
}

/* 退格键 */
else if (ch == 127)
{
key = BACK;
}

/* 回车键 */
else if (ch == '\n')
{
key = UNKNOW;
}

/* 普通字符则需要保存 */
else
{
/* 先移动字符,后插入新字符实现字符输入 */
for (i = len; i > *idx; i--)
{
dest[i] = dest[i-1];
}

dest[*idx] = ch;  // 光标处插入字符
(*idx)++;         // 光标右移

key = NOMAL;
}

return key;
}

/*
* 函数名: showChar()
* 函数功能: 显示源字符和用户输入的目标字符
*           并进行校对
* 参数: 1.源字符数组; 2.用户输入的目标字符数组
*       3.光标位置
* 返回值: 无
*/
void showChar(char const *src, char *dest, int idx)
{
int i;

printf("\033[2;1H");  /* 定位到第二行开头 */
printf("\033[K");     /* 清除该行内容 */

/* 打印用户的输入 */
for (i = 0; dest[i] != '\0'; i++)
{
/* 字符匹配显示绿色 */
if (dest[i] == src[i])
{
printf("\033[32m%c\033[0m", dest[i]);
}

/* 字符不匹配显示红色 */
else
{
printf("\033[31m%c\033[0m", dest[i]);
}
}

/* 光标定位到索引要处 */
printf("\033[2;%dH", idx+1);
}

/*
* 函数名: deleteChar()
* 函数功能: 删除光标所在位置的前一个字符
* 参数: 1.用户输入的目标字符数组;
*       2.光标所在位置
* 返回值: 无
*/
void deleteChar(char *dest, int *idx)
{
int i;

if (*idx > 0)
{
/* 通过移动覆盖实现删除 */
for (i = *idx; dest[i] != 0; i++)
{
dest[i-1] = dest[i];
}

dest[i-1] = '\0'; // 最后一个字符补0

(*idx)--;         // 光标左移
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C语言 打字程序