TypeWriting
头文件getputch.h
/* * getputch.c */ /* 用于getch/putch的通用头文件"getputch.h" */ #ifndef __GETPUTCH #define __GETPUTCH #if defined(_MSC_VER) || (__TURBOC__) || (LSI_C) /* MS-Windows/MS-DOS(Visual C++, Borland C++, LSI-C 86 etc ...)*/ #include <conio.h> static void init_getputch(void) { /* 空 */ } static void term_getputch(void) { /* 空 */ } #else /* 提供了Curses库的UNIX/Linux/OS X环境 */ #include <curses.h> #undef putchar #undef puts #undef printf static char __buf[4096]; /*--- _ _putchar:相当于putchar函数(用“换行符+回车符”代替换行符进行输出)---*/ static int __putchar(int ch) { if (ch == '\n') putchar('\r'); return putchar(ch); } /*--- putch:显示1个字符,清除缓冲区 ---*/ static int putch(int ch) { int result = putchar(ch); fflush(stdout); return result; } /*--- _ _printf:相当于printf函数(用“换行符+回车符”代替换行符进行输出)---*/ static int __printf(const char *format, ...) { va_list ap; int count; va_start(ap, format); vsprintf(__buf, format, ap); va_end(ap); for (count = 0; __buf[count]; count++) { putchar(__buf[count]); if (__buf[count] == '\n') putchar('\r'); } return count; } /*--- _ _puts:相当于puts函数(用“换行符+回车符”代替换行符进行输出)---*/ static int __puts(const char *s) { int i, j; for (i = 0, j = 0; s[i]; i++) { __buf[j++] = s[i]; if (s[i] == '\n') __buf[j++] = '\r'; } return puts(__buf); } /*--- 库初始处理 ---*/ static void init_getputch(void) { initscr(); cbreak(); noecho(); refresh(); } /*--- 库终止处理 ---*/ static void term_getputch(void) { endwin(); } #define putchar __putchar #define printf __printf #define puts __puts #endif #endif
消除一个字符串:
/* *type_erase_string.c */ #include<time.h> #include<ctype.h> #include<stdio.h> #include<string.h> #include"getputch.h" int main() { int i; char *str = "How do you do?"; int len = strlen(str); clock_t start, end; init_getputch(); printf("please input as same\n"); printf("%s\n", str); fflush(stdout); start = clock(); for (i = 0; i < len; i++) { int ch; do { ch = getch(); //从键盘读取信息,getputch.h函数 if (isprint(ch)) { putch(ch); if (ch != str[i]) { putch('\b'); //光标退一格 } } }while (ch != str[i]); } end = clock(); printf("\nspend time %1.fs. \n", (double)(end - start) / CLOCKS_PER_SEC); //ubuntu14显示不出来,应该可以用localtime来显示 term_getputch(); return 0; }
消除已经输出的字符
/* *type_erase_string_put.c */ #include<stdio.h> #include<time.h> #include<stdio.h> #include<string.h> #include"getputch.h" int main() { int i; char *str = "How do you do?"; int len = strlen(str); clock_t start, end; init_getputch(); printf("please input as following\n"); start = clock(); for (i = 0; i < len; i++) { //显示str[i]以后的字符并把光标返回到开头 \r 回车符 printf("%s \r", &str[i]); fflush(stdout); while(getch() != str[i]) ; } end = clock(); printf("spending time %.1f s \n", (double)(end-start)/CLOCKS_PER_SEC); term_getputch(); return 0; }
输入多个字符串
/* *type_put_more.c */ #include<stdio.h> #include<time.h> #include<string.h> #include"getputch.h" #define QNO 12 int main() { char *str[QNO] = {"book", "computer", "default", "comfort", "monday", "power", "light", "music", "programming", "dog", "video", "include"}; int i, stage; clock_t start, end; init_getputch(); printf("Starting practice type. \n"); printf("please enter space to start.\n"); while(getch() != ' ') ; start = clock(); for (stage = 0; stage < QNO; stage++) { int len = strlen(str[stage]); for (i = 0; i < len; i++) { //显示str[stage][i]以后的字符并把光标返回到开头 printf("%s \r", &str[stage][i]); fflush(stdout); while (getch() != str[stage][i]) ; } } end = clock(); printf("\rSpending time %.1f second . \n", (double)(end - start)/CLOCKS_PER_SEC); term_getputch(); return 0; }
打乱出题顺序,使用数组来标识出题顺序
/* *type_random.c */ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> #include"getputch.h" #define QNO 12 #define swap(type, x, y) do{type t = x; x = y; y = t;}while(0) int main() { char *str[QNO] = {"book", "computer", "default", "comfort", "monday", "power", "light", "music", "programming", "dog", "video", "include"}; int i, stage; int qno[QNO]; //出题顺序 clock_t start, end; init_getputch(); srand(time(NULL)); //设置随机数种子 for (i = 0; i < QNO; i++) { qno[i] = i; } for (i = QNO - 1; i > 0; i--) //打乱出题顺序 { int j = rand()% (i + 1); if (i != j) { swap(int , qno[i], qno[j]); } } printf("Starting type practice.\n"); printf("Starting after entering space .\n"); while (getch() != ' ') ; start = clock(); for (stage = 0; stage < QNO; stage++) { int len = strlen(str[qno[stage]]); for (i = 0; i < len; i++) { printf("%s \r", &str[qno[stage]][i]); fflush(stdout); while (getch() != str[qno[stage]][i]) ; } } end = clock(); printf("\r Costing time : %.1f seconds. \n", (double)(end - start)/CLOCKS_PER_SEC); term_getputch(); return 0; }
交换指针打乱出题顺序:
/* *type_random_2.c */ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> #include"getputch.h" #define QNO 12 #define swap(type, x, y) do {type t = x; x = y; y = t;} while(0) int main() { char *str[QNO] = {"book", "computer", "default", "comfort", "monday", "power", "light", "music", "programming", "dog", "video", "include"}; int i, stage; clock_t start, end; init_getputch(); srand(time(NULL)); for (i = QNO - 1; i > 0; i--) { int j = rand()%(i+1); if (i != j) { swap(char *, str[i], str[j]); } } printf("Starting type practice\n"); printf("Start after entering space. \n"); while (getch() != ' ') ; start = clock(); for (stage = 0; stage < QNO; stage++) { int len = strlen(str[stage]); for (i = 0; i < len; i++) { printf("%s \r", &str[stage][i]); fflush(stdout); while(getch() != str[stage][i]) ; } } end = clock(); printf("\r Costing time : %.1f seconds \n", (double)(end-start)/CLOCKS_PER_SEC); term_getputch(); return 0; }
键盘联想字符:输出键盘一块区域的字符,隐藏一个,打出隐藏的这个字符
/* *type_keyboard.c */ #include<stdio.h> #include<string.h> #include<stdlib.h> #include<time.h> #include"getputch.h" #define NO 3 #define KTYPE 16 int main() { char *kstr[] = {"12345", "67890-=", "!@#$%", "^&*()_+", "qlert", "yuiop[]\\", "QWERT", "YUIOP{}|", "asdfg", "hjkl;'", "ASDFG", "HJKL:\"" "zxcvb", "nm,./", "ZXCVB", "NM<>?"}; int i, stage; clock_t start, end; init_getputch(); srand(time(NULL)); printf("Starting practice type \n"); printf("please use ? to hidden type. \n"); printf("Start entering space\n"); fflush(stdout); while(getch() != ' ') ; start = clock(); for (stage = 0; stage < NO; stage++) { int k, p, key; char temp[10]; do { k = rand() % KTYPE; p = rand() % strlen(kstr[k]); key = kstr[k][p]; }while(key == ' '); strcpy(temp, kstr[k]); temp[p] = '?'; printf("%s", temp); fflush(stdout); while(getch() != key) ; putchar('\n'); } end = clock(); printf("Costing time : %.1f seconds. \n", (double)(end - start)/CLOCKS_PER_SEC); term_getputch(); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)