好渴鹅命令行

好渴鹅命令行

本代码仅能在 VC++ 23 的情况下通过编译并运行,可能会有小 bug。所有的文件必须放在同一个文件夹下。

Update

  • 添加了清屏命令;
  • 添加了查看版本命令;
  • 添加了 cd 命令。

本代码遵循 CC-BY-NC-ND (署名-非商业使用-禁止演绎)协议。(本协议最为严格,因为无法继续解析、翻译、转载。)

HString.h

#pragma once

#include <cstring>
#include <string>

using namespace std;

class HString {
private:
  basic_string<char> __Str;

public:
  HString() = default;

  HString(basic_string<char> __Str) {
    this->__Str = __Str;
  }

  HString(const char *__Str) {
    this->__Str = __Str;
  }

  HString(const char __c) {
    char __Str[2];
    *__Str = __c;
    this->__Str = __Str;
  }

  void push_back(char __x) {
    __Str.push_back(__x);
  }

  void pop_back() {
    __Str.pop_back();
  }

  char &operator[](size_t __id) {
    return __Str[__id];
  }

  size_t size() {
    return __Str.size();
  }

  const char *str() {
    return __Str.c_str();
  }

  char &back() {
    return __Str.back();
  }

  char &front() {
    return __Str.front();
  }

  HString substring(size_t __Begin, size_t __Size) {
    return __Str.substr(__Begin, __Size);
  }

  HString &operator+=(HString _Right) {
    __Str += _Right.__Str;
    return *this;
  }

  friend bool operator==(HString &_Left, HString &_Right) {
    return _Left.__Str == _Right.__Str;
  }

  friend bool operator==(HString &_Left, string &_Right) {
    return _Left.__Str == _Right;
  }

  friend bool operator==(HString &_Left, const char *_Right) {
    return _Left.__Str == _Right;
  }

  friend HString operator+(HString &_Left, const char *_Right) {
    return HString(_Left.__Str + _Right);
  }

  friend HString operator+(const char *_Left, HString &_Right) {
    return HString(_Left + _Right.__Str);
  }

  friend ostream &operator<<(ostream &out, HString &__Str) {
    out << __Str.__Str;
    return out;
  }

  friend string &operator+=(string &__Left, HString __Right) {
    return __Left += __Right.str();
  }
};

HVector.h

#pragma once

#include <vector>
#include <initializer_list>

using namespace std;

template<typename _Ty>
class HVector {
private:
  vector<_Ty> __Arr;

public:
  HVector() = default;

  HVector(initializer_list<_Ty> __List) {
    __Arr = __List;
  }

  void push_back(_Ty __x) {
    __Arr.push_back(__x);
  }

  void pop_back() {
    __Arr.pop_back();
  }

  _Ty &operator[](size_t __id) {
    return __Arr[__id];
  }

  size_t size() {
    return __Arr.size();
  }

  _Ty &back() {
    return __Arr.back();
  }

  _Ty &front() {
    return __Arr.front();
  }
};

header.h

#pragma once

#include <iostream>
#include <string>
#include <format>
#include <vector>
#include <windows.h>
#include <conio.h>
#include <print>
#include "HVector.h"
#include "HString.h"

#define EndLine() cout << endl
#define SentenceError() println("语句错误!若想查看手册,请输入-help")

using namespace std;

const string Version = "2023.1.1.1";

string Dir = "Haokee";
vector<string> 语录{"它是文明美公鸡,一口一个大可爱。——好渴鹅", "X-i-a-o-B-i--a-n-t-a-i-就是我!"};

void InitConsole() {
  SetConsoleTitle(L"命令行 - 好渴鹅");
  srand(time(nullptr));
  println("Haokee Command. [版本 {}]", Version);
  println("(c) Haokee Corporation。保留所有权利。");
  cout << endl;
}

HVector<HString> Split(HString __Str) {
  HVector<HString> __Vec;
  __Vec.push_back("");
  char __Last = -1;
  for (int i = 0; i < __Str.size(); i++) {
    if (__Str[i] == 32 && __Last != 32) {
      __Last = __Str[i], __Vec.push_back("");
    } else {
      __Vec.back().push_back(__Str[i]);
    }
  }
  return __Vec;
}

HString ToLower(HString __Str) {
  for (int i = 0; i < __Str.size(); i++) {
    if (isupper(__Str[i])) {
      __Str[i] = tolower(__Str[i]);
    }
  }
  return __Str;
}

HVector<HString> ToLower(HVector<HString> __Vec) {
  for (int i = 0; i < __Vec.size(); i++) {
    __Vec[i] = ToLower(__Vec[i]);
  }
  return __Vec;
}

bool HStringCheck(HString __Str, HVector<HString> __Table) {
  for (int i = 0; i < __Table.size(); i++) {
    if (__Str == __Table[i]) {
      return 1;
    }
  }
  return 0;
}

namespace Help {
  void Clear() {
    println("-a, -all: 清屏所有区域");
    println("-e, -every: 清理当前窗口并关闭");
    println("-h, -help: 寻求帮助");
  }
}

namespace Operation {
  void Haokee(HVector<HString> __Vec) {
    if (__Vec.size() == 2) {
      if (HStringCheck(__Vec[1], { "-v", "-version" })) {
        println("Haokee Command. [版本 {}]", Version);
        println("(c) Haokee Corporation。保留所有权利。");
      } else if (HStringCheck(__Vec[1], { "-n", "-new", "-s", "-start"})) {
        system("start .\\好渴鹅命令行交互.exe");
      } else if (HStringCheck(__Vec[1], { "-h", "-help" })) {
        println("-v, -version: 查看命令行版本");
        println("-n, -new, -s, -start: 打开新窗口");
      } else {
        SentenceError();
      }
    } else {
      SentenceError();
    }
    EndLine();
  }
  void Clear(HVector<HString> __Vec) {
    if (__Vec.size() == 1) {
      system("cls");
      InitConsole();
    } else if (__Vec.size() == 2) {
      if (HStringCheck(__Vec[1], { "-a", "-all"})) {
        system("cls");
      } else if (HStringCheck(__Vec[1], { "-e", "-every"})) {
        exit(0);
      } else if (HStringCheck(__Vec[1], { "-h", "-help" })) {
        Help::Clear();
      } else {
        SentenceError();
      }
    } else {
      SentenceError();
    }
    EndLine();
  }
  void SwitchDir(HVector<HString> __Vec) {
    if (__Vec.size() == 2) {
      if (__Vec[1].front() == '.') {
        Dir += __Vec[1].substring(2, __Vec[1].size() - 2);
      } else {
        Dir = __Vec[1].str();
      }
    } else {
      println("目录格式错误!");
    }
    EndLine();
  }

  void 每日一言() {
    int p = rand() % 语录.size();
    println("{}", 语录[p]);
  }
}

void Main() {
  string Str;
  HVector<HString> Word;
  while (1) {
    print("{}>", Dir);
    getline(cin, Str);
    Word = Split(Str);
    if (!Word.size()) {
      continue;
    }
    Word = ToLower(Word);
    if (HStringCheck(Word.front(), { "haokee", "hke" })) {
      Operation::Haokee(Word);
    } else if (HStringCheck(Word.front(), { "cls", "clear", "clr" })) {
      Operation::Clear(Word);
    } else if (HStringCheck(Word.front(), { "cd", "goto" })) {
      Operation::SwitchDir(Word);
    } else if (HStringCheck(Word.front(), { "stc", "每日一言" })) {
      Operation::每日一言();
    }
  }
}

main.cpp

#include "header.h"

int main() {
  InitConsole();
  Main();
  return 0;
}
posted @ 2023-10-15 17:09  haokee  阅读(38)  评论(0)    收藏  举报