一、简介
由于项目中写了个测试的控制台程序,是每次读取一行,即通过getline()来实现的,所以每次必须输入全路径名称,才能实现运行。
大家都觉得麻烦,就写了个tab键自动选择补全的。
目前基本可实现功能,但是没有回退的功能和跳出循环,有需用的就自己改吧。
此程序基于windows的控制台实现的。
二、实现过程
1.代码自我感觉还算清楚。里面有部分注释。
#include<stdio.h> #include<string> #include<conio.h> #include<map> usingnamespacestd; #include<windows.h> #include<stdlib.h> #include<wincon.h> //tab键获取相关值,并打印到屏幕上。 voidtab_find_char(std::map<int,char*>store_compare_,char*store_input,inti_store_input_count,int&tab_count); //从字符中找到相关字符,并返回相关字符。 char*get_attach(constchar*stacks_,constchar*needle_); voidconsole_start(); voidconsole_end(); voidwrite(constchar*message,intlength); voidwrite(constchar*message); voidread(char*buffer,size_tsize); #include<iostream> #include"conio.h" //记录屏幕光标位置 staticCOORDcurser_position; voidmain() { console_start(); //自定义的可搜索库字符集 staticstd::map<int,char*>store_compare; store_compare[0]="thread_parameter_"; store_compare[1]="parameter_"; store_compare[2]="build"; store_compare[3]="compile"; intcount=0; charch; while(true) { inttab_count=0; charstore_input[256]; inti_store_input_count=0; //记录光标位置 HANDLEhOut; CONSOLE_SCREEN_BUFFER_INFObInfo; hOut=GetStdHandle(STD_OUTPUT_HANDLE); GetConsoleScreenBufferInfo(hOut,&bInfo); curser_position.X=bInfo.dwCursorPosition.X; curser_position.Y=bInfo.dwCursorPosition.Y; do { ch=(char)_getch(); if(ch!='\n') { if(ch=='q') { break; } elseif(ch==9) { tab_find_char(store_compare,store_input,i_store_input_count,tab_count); tab_count++; } //接受数字和全部字母和部分特殊符号。 elseif((ch>=48&&ch<=57)||(ch>=65&&ch<=122)) { char*temp_char=newchar[1]; temp_char[0]=ch; write(temp_char,1); store_input[i_store_input_count]=ch; i_store_input_count++; } } } while(ch!='\r'); write("\n"); } console_end(); } voidtab_find_char(std::map<int,char*>store_compare_,char*store_input,inti_store_input_count,int&tab_count) { if(i_store_input_count<0||tab_count<0) { return; } intmap_size=store_compare_.size(); tab_count=tab_count%map_size; i_store_input_count+=1; store_input[i_store_input_count-1]='\0'; char*pri_temp_input=newchar[i_store_input_count]; strncpy(pri_temp_input,store_input,i_store_input_count); inti_catch_times=0; HANDLEhOut; hOut=GetStdHandle(STD_OUTPUT_HANDLE); for(inti=0;i<map_size;i++) { char*pri_get_supply=get_attach(store_compare_[i],pri_temp_input); if(NULL!=pri_get_supply) { if(tab_count>i_catch_times) { i_catch_times++; continue; } |