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

/***********************************************
 * 文件名: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)--;		  // 光标左移
    }
}
  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值