tab自动补齐的c++实现
程序员文章站
2022-06-01 12:46:41
...
用过Linux系统的人哪怕是初学者,估计也会对TAB补齐有好感
现在要在windows平台下模拟一个Linux的文件系统,TAB补齐这么赞的功能怎能缺失
便自己写了一个玩玩:
代码在下面:
// tab.cpp: 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>
#include <string>
#include <conio.h>
#include <vector>
#include <string>
#include <iostream>
using namespace std;
vector <string> vc_of_str;
/*
ubuntu中的tab自动补全功能
在输入第一个操作数的时候是补全所有的指令
输入第二个操作数的时候是补全所有的当前目录下的东西
*/
int main() {
string s1, s2;
vc_of_str.push_back("cd");
vc_of_str.push_back("mkdir");
vc_of_str.push_back("ls");
vc_of_str.push_back("vi");
vc_of_str.push_back("sudo");
vc_of_str.push_back("rm");
vc_of_str.push_back("touch");
vc_of_str.push_back("man");
vc_of_str.push_back("cat");
vc_of_str.push_back("clear");
string s;
int tabcount = 0;
while (1) {
int ch = _getch();
if (ch == 8) { //退格
printf("%c", 8);
printf(" ");
printf("%c", 8);
if(!s.empty())
s.pop_back();
}
else if (ch == 13) { //回车
printf("\n");
s = "";
}
else if (ch == 9) { //tab
int count = 0; vector<int>v;
for (int i = 0; i < vc_of_str.size(); i++) {
if (vc_of_str[i].length() >= s.length() && vc_of_str[i].substr(0, s.length()) == s) {
count++; v.push_back(i);
}
}
if (count < 1) {
s.push_back(' ');
printf(" ");
}
if (count == 1) {
for (int i = s.length(); i < vc_of_str[v[0]].length(); i++) {
s.push_back(vc_of_str[v[0]][i]);
printf("%c", vc_of_str[v[0]][i]);
}
}
if (count > 1 && tabcount) {
cout << "\n" << vc_of_str[v[0]];
for (int i = 1; i < v.size(); i++) {
cout << " " << vc_of_str[v[i]];
}
cout << endl << s;
}
}
else if (ch == ' ') {
}
else {
printf("%c", ch);
s.push_back(ch);
}
if (ch == 9) {
tabcount++;
}
else {
tabcount = 0;
}
}
}
注意:项目设置的使用字符集要改成未设置,而非Unicode字符集
不过我也没试过,有缘人可以尝试一下
代码在VS上是可以运行的
补全的字符集是vector<string>中的,应该还行
时间复杂度为O(n),理论上用字典树的话可以O(logn),不过懒得做了
明天做个可以补全路径的