C++實現tab補全(Windows限定)

The_Dark_Archon發表於2017-06-06

如何實現tab補全(Windows)

什麼是tab補全?

   Windows的cmd可以通過dir指令檢視當前目錄,然後可以嘗試點一下tab,發現會自動補全為當前目錄下的檔名。

那麼問題來了

   C++自帶函式庫無法實現tab補全,因而如果你希望設定一些指令,讓使用者輸入指令的話,要輸入全部。因此要實現tab補全

tab補全需要實現的

   開啟cmd,然後可以親手試一下…(本篇可能很長,可以用目錄跳過)
原本目錄裡有這些東西
原本
輸入一個d後按tab,可以發現它利用關鍵字d跳過了.android等直接來到了Desktop
tab+
再次按下,發現關鍵字不是Desktop而是d,來到了Documents
這裡寫圖片描述
(無圖)輸入a,再退格,發現關鍵字不再是d,如果有研究的話,發現關鍵字來到了Documents
這說明了tab補全的幾個內容:
- 通過當前關鍵字搜尋一些字串
- 搜尋完後不是立刻改變關鍵字,而是按下tab以外的鍵後

然後就是實現程式碼了

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<conio.h>
#include<cstring>
using namespace std;
/*int&const*/
string command;
/*tab*/
struct tab_key
{
    string s;
}keyword[101];
string lastfind;int laststop;
string finding;
int totkey;
void add_key(string a);
void Init_tabing();
string tabing();
void getcom(string *s);
/*------*/
void Init_tabing()
{
    keyword[1].s="create ";
    keyword[2].s="exit ";
    //樣例關鍵字
    for(totkey=1;totkey<=100;++totkey)//統計關鍵字個數
    {
        if(keyword[totkey].s.empty())
        {
            --totkey;
            break;
        }
    }

}
string tabing()
{
    /*
    string finding;
    string lastfind;
    */
    string error="error";
    int i;
    if(finding==lastfind)
    {
        i=laststop;
    }
    else i=1;
    for(;i<=totkey;++i)
    {
        if(keyword[i].s.find(finding)<=100&&keyword[i].s.find(finding)>=0)
        {
            laststop=i+1;
            lastfind=finding;
            return keyword[i].s;
        }
    }


    return error;
}
/*By:CSDN The_Dark_Archon*/
string getcom()
{
    bool reset=1;
    string output;
    char tmp;

    while(tmp!=13)
    {
        if(reset==1)
        {
            system("cls");
            reset=0;
            printf("E:\\Input>");
            cout<<output;
        }
        else cout<<tmp;
        tmp=getch();
        if(tmp==9)
        {
            string tt=tabing();
            if(tt!="error")
            {
                output=tt;
                output.erase(output.end()-1);
            }
            reset=1;
        }
        else if(tmp==8)
        {
            if(output.empty()==false) output.erase(output.end()-1);
            reset=1;
        }
        else
        {
            output+=tmp;
            finding=output;
        }
    }
    return output;
}

int main()
{
    Init_tabing();
    command=getcom();

    cout<<"\nRunning "<<command<<endl;
    return 0;
}

結果是成功實現了tab補全,當然和cmd有點差距,如按退格等會一閃一閃的,這個更新的cls有關,但是出了一閃一閃之外也沒有什麼Bug了。
這個模板112行lol

相關文章