I have the following code that converts a couple of bash commands into Windows `cmd` commands, as well as adding some commands. This is only my second day programming in C++, so any and all suggestions would be helpful. #include "stdafx.h" #include <iostream> #include <string> #include <regex> #include <fstream> #include <stdlib.h> #include <time.h> #include <conio.h> using namespace std; using namespace std::tr1; class Parser { regex ls_regex, mkdir_regex, sleep_regex, rand_regex, rm_regex, touch_regex, cat_regex, open_regex, cp_regex, lat_regex; string touch_match, sleep_match, mkdir_match, ls_match, rm_match, open_match, cp_match; public: void SetRegexes(); void RunCommand(string); string ParseCommand(string); string SearchString(int, string); }; void Parser::SetRegexes() { // Regex is the bash command, match is the cmd command ls_regex = "^ls$"; ls_match = "dir"; mkdir_regex = "^mkdir"; mkdir_match = "md"; sleep_regex = "^sleep$"; sleep_match = "pause"; rand_regex = "^timerand$"; rm_regex = "^rm"; rm_match = "del"; touch_regex = "^touch"; cat_regex = "^cat"; open_regex = "^open"; open_match = "notepad"; cp_regex = "^cp"; cp_match = "copy"; lat_regex = "^lat"; } string Parser::ParseCommand(string unparsed) { // Checks if the regex can be found in the unparsed string if (regex_search(unparsed, ls_regex)) { // Unparsed now is actually parsed unparsed = unparsed.replace(0, 3, ls_match); } else if (regex_search(unparsed, mkdir_regex)) { unparsed = unparsed.replace(0, 5, mkdir_match); } else if (regex_search(unparsed, sleep_regex)) { unparsed = unparsed.replace(0, 4, sleep_match); } else if (regex_search(unparsed, rand_regex)) { srand(time(NULL)); cout << rand() << endl; return " "; } else if (regex_search(unparsed, rm_regex)) { unparsed = unparsed.replace(0, 2, rm_match); } else if (regex_search(unparsed, touch_regex)) { string tfile; for (int i = 0; i < unparsed.length(); i++) { if (i > 5) { tfile += unparsed[i]; } } ofstream create_file(tfile); return " "; } else if (regex_search(unparsed, cat_regex)) { string op_line; string catfile; for (int i = 0; i < unparsed.length(); i++) { if (i > 3) { catfile += unparsed[i]; } } ifstream input_file(catfile); while (input_file.good()) { getline(input_file, op_line); cout << op_line; } cout << endl; return " "; } else if (regex_search(unparsed, open_regex)) { unparsed = unparsed.replace(0, 5, open_match + " "); } else if (regex_search(unparsed, cp_regex)) { unparsed = unparsed.replace(0, 4, cp_match + " "); } else if (regex_search(unparsed, lat_regex)) { string latfile; string op_line; char holder; for (int i = 0; i < unparsed.length(); i++) { if (i > 3) { latfile += unparsed[i]; } } cout << latfile << endl << endl; ifstream input_file(latfile); while (input_file.good()) { getline(input_file, op_line); cout << op_line << endl; // getch() makes it so the letters are not echoed to the keyoard holder = getch(); } return " "; } return unparsed; } void Parser::RunCommand(string parsed) { // Converts to a different type so it can be used in the system method const char *cparsed = parsed.c_str(); system(cparsed); } void _tmain(int argc, _TCHAR* argv[]) { string name; int line_counter = 0; Parser main_parser; main_parser.SetRegexes(); string command; // Provides a never-ending command line interface while (true) { line_counter++; cout << "<" << line_counter << name << "-> "; //cin >> command; getline(cin, command); command = main_parser.ParseCommand(command); main_parser.RunCommand(command); } }