C++tabキーによる自動補完入力機能の実現
一、紹介
プロジェクトにテストのコンソールプログラムが書かれているため、実行を実現するには、1行ずつ読み込まれ、getline()で実現されるため、毎回フルパス名を入力する必要があります.
みんな面倒だと思って、tabキーを書いて自動的に補完しました.
現在は基本的に機能が実現していますが、ロールバック機能やジャンプサイクルがなく、必要なものがあれば自分で変更しましょう.
このプログラムはwindowsのコンソールに基づいて実現されます.
二、実現過程
1.コードの自己感覚はまだはっきりしている.コメントが一部入っています.
2.vs 2012でテスト結果は可能です.マップをあげません.
プログラムを実行し、入力、tをテストし、tabキーを切り替えると自動補完機能が表示されます.
入力_異なる単語を選択して、車に戻って、他のテストに変えることができます.足りないところ、よろしくお愿いします.すべてのソースはここにあります.リソースにリンクしたりしません.
プロジェクトにテストのコンソールプログラムが書かれているため、実行を実現するには、1行ずつ読み込まれ、getline()で実現されるため、毎回フルパス名を入力する必要があります.
みんな面倒だと思って、tabキーを書いて自動的に補完しました.
現在は基本的に機能が実現していますが、ロールバック機能やジャンプサイクルがなく、必要なものがあれば自分で変更しましょう.
このプログラムはwindowsのコンソールに基づいて実現されます.
二、実現過程
1.コードの自己感覚はまだはっきりしている.コメントが一部入っています.
#include<stdio.h>
#include <string>
#include <conio.h>
#include <map>
using namespace std;
#include<windows.h>
#include<stdlib.h>
#include<wincon.h>
// tab , 。
void tab_find_char(std::map<int,char*> store_compare_,char* store_input,int i_store_input_count,int& tab_count);
// , 。
char* get_attach(const char* stacks_,const char* needle_);
void console_start();
void console_end();
void write(const char* message,int length);
void write(const char* message);
void read(char* buffer, size_t size);
#include <iostream>
#include "conio.h"
//
static COORD curser_position;
void main()
{
console_start();
//
static std::map<int,char*> store_compare;
store_compare[0] = "thread_parameter_";
store_compare[1] = "parameter_";
store_compare[2] = "build";
store_compare[3] = "compile";
int count=0;
char ch;
while (true)
{
int tab_count = 0;
char store_input[256];
int i_store_input_count = 0;
//
HANDLE hOut;
CONSOLE_SCREEN_BUFFER_INFO bInfo;
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 !='
')
{
if (ch == 'q')
{
break;
}
else if (ch == 9)
{
tab_find_char(store_compare,store_input,i_store_input_count,tab_count);
tab_count++;
}
// 。
else if( (ch >= 48 && ch <= 57) || (ch >= 65 && ch <= 122) )
{
char* temp_char = new char[1];
temp_char[0] = ch;
write(temp_char,1);
store_input[i_store_input_count] = ch;
i_store_input_count++;
}
}
}
while (ch!='\r');
write("
");
}
console_end();
}
void tab_find_char(std::map<int,char*> store_compare_,char* store_input,int i_store_input_count,int& tab_count)
{
if (i_store_input_count < 0 || tab_count < 0)
{
return;
}
int map_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 = new char [i_store_input_count];
strncpy(pri_temp_input,store_input,i_store_input_count);
int i_catch_times = 0;
HANDLE hOut;
hOut = GetStdHandle(STD_OUTPUT_HANDLE);
for (int i = 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;
}
//clear
SetConsoleCursorPosition(hOut,curser_position);
string out_put_string = " ";
write(out_put_string.c_str());
SetConsoleCursorPosition(hOut,curser_position);
write(store_compare_[i]);
break;
}
}
delete pri_temp_input;
pri_temp_input = NULL;
i_store_input_count -= 1;
return;
}
char* get_attach(const char* stacks_,const char* needle_)
{
char* pri_string_stack = (char*)stacks_;
char* pri_string_needle = (char*)needle_;
char* pri_string = strstr(pri_string_stack,pri_string_needle);
return pri_string;
}
/*---------------------------------------------------------*/
void console_start()
{
AllocConsole();
DWORD dwConsoleMode;
GetConsoleMode(NULL, &dwConsoleMode);
dwConsoleMode ^= ENABLE_LINE_INPUT;
dwConsoleMode ^= ENABLE_ECHO_INPUT;
//wConsoleMode ^= ENABLE_AUTO_POSITION;
SetConsoleMode(NULL, dwConsoleMode);
const char* message = "welcome! test started. atuhor by zhang pengju
";
write(message);
}
void console_end()
{
FreeConsole();
}
void write(const char* message,int length)
{
if (length <= 0)
{ return;
}
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), message, length, NULL, NULL);
}
void write(const char* message)
{
int length = strlen(message);
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), message, length, NULL, NULL);
}
void read(char* buffer, size_t size)
{
DWORD nNumberOfCharsToRead;
BOOL result = ReadConsoleA(GetStdHandle(STD_INPUT_HANDLE), buffer, size, &nNumberOfCharsToRead, NULL);
buffer[nNumberOfCharsToRead - 2] = 0;
}
2.vs 2012でテスト結果は可能です.マップをあげません.
プログラムを実行し、入力、tをテストし、tabキーを切り替えると自動補完機能が表示されます.
入力_異なる単語を選択して、車に戻って、他のテストに変えることができます.足りないところ、よろしくお愿いします.すべてのソースはここにあります.リソースにリンクしたりしません.