欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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),不过懒得做了

明天做个可以补全路径的