Search code examples
c++stringinputcall

Is it possible to use input as a call to a string?


I'm creating a command line symbols generator. The idea is when you call the program with a symbol name it outputs the symbol. I wonder if I can pass the input string as a command to cout.

For every symbol I add I have to manually add "else if" statement.

#include <bits/stdc++.h>
using namespace std;

string const notfound = R"~(

                         ______                     
 _________        .---"""      """---.              
:______.-':      :  .--------------.  :             
| ______  |      | :                : |             
|:______B:|      | |  Little Error: | |             
|:______B:|      | |                | |             
|:______B:|      | |  Symbol not    | |             
|         |      | |  found.        | |             
|:_____:  |      | |                | |             
|    ==   |      | :                : |             
|       O |      :  '--------------'  :             
|       o |      :'---...______...---'              
|       o |-._.-i___/'             \._              
|'-.____o_|   '-.   '-...______...-'   -._          
:_________:       .____________________    -.___.-. 
                 .'.eeeeeeeeeeeeeeeeee.'.      :___:
               .'.eeeeeeeeeeeeeeeeeeeeee.'.         
              :____________________________:

)~";
string const butterfly = R"~(
                              $¶¶$¶¶$¶$
                           $¶¶$ø¢¢øø17¶$
                          ¶¢1 7oøoø o7¶1
 11¶¶¶¶¶¶¶¶¶ø           ø¶ø 1oø¢o1ø o¶¢ 
¶¶¢¶ø¢¢¢¢77oø¶¶¶        ¶¢7ø$øoo7o$77¶o 
¶¶7 7o77177777oø¶¶1    ¶øooo77777oø7¶¶
 ¶¶¶7o¢øø77ø¢ooooø¶¶¶¶¶¶¢oooo7177¢7o¶7
   ¶¶7 oooooooo77177o7øø¢¢ø¢ooooøø¢¶
    7¶¢o7¢øoo7717oøø¶¶øoø¢ooo¢¢ooooo$7
     7¶¶ø17oo7oø¶øøooøooooo777o¢oo71 o¶1
       1¶¶$oø$$¢111¢1o¶¶ø7oøøo7ooooø7¢1¶
         ø177 o1 ooo ¢ø ¶ø7oooø¢oo1¢1ø7¶
        ¶¢¢7o7oo¢oøo ø¶  ¶¶ooo77o7ø¶1 o¶
       1ø$oøo1øø¢¢7o ¶ø   ø¶¢$$¢$¶77oø¶7
       7¶17ø77¢7711¶7¶      ¢¢ø   71¢¶1
        ø¶$¢øø71oøø¢¢¶        øø¶¶¶¶¶o
         7¶oø¶¶¶¢77¶¶ 
           $¶¶ø¢¶¶¶7 
)~";

void Print_Symbol(string x){
    if(x == "butterfly")
        cout<<butterfly<<endl;
        // Add else if for every new symbol
    else
    cout<<notfound<<endl;

}
int main(int argc,char* argv[]){
    if(argc < 2){
        cout<<"To get a symbol enter: sym Symbol_Name"<<'\n';
        cout<<"Available Symbols: "<<'\n';
        cout<<"hello, hi,butterfly,.."<<'\n';
    }
    for(int i=1;i<argc;i++){
        string x = argv[i];
        Print_Symbol(x);
    }
    return 0;
}

With few symbols this isn't a problem. But when I move the symbols to another file, I want to be able to add a symbol without recompiling the main program

Is it possible to do it like this

int main(int argc,char* argv[]){
    if(argc < 2){
        cout<<"To get a symbol enter: sym Symbol_Name"<<'\n';
        cout<<"Available Symbols: "<<'\n';
        cout<<"hello, hi,butterfly,.."<<'\n';
    }
    for(int i=1;i<argc;i++){
        string x = argv[i];
          // pass the string to cout
        cout<<x<<'\n';
    }
    return 0;
}

Solution

  • C++ is a static language. I don't see how you can do that, at least not yet. But to bypass else/if statements there are multiple ways.

    Solution 1: Use std::map

    By using the std::map template class, and a simple std::find you can avoid using else if statements.

    void Print_Symbol(string x){
        static const std::map<string, string> symbs ({
            {"butterfly", butterfly} // add more here
        });
        auto res = symbs.find(x);
        if (res == symbs.end())
           cout<< notfound <<endl;
        else
           cout << *res << endl;
    }
    

    Solution 2: Use std::vector or ...

    Practically the same as solution 1.

    Solution 3: Use files

    In your case you can put each symbol in its own file and what the user inputs, is the file name.

    Solution 4: Use switch case

    I know in c++ you can't use strings in switch cases, but you can convert each string to a number, then put those in switch case. I don't recommend it for here though.


    There are other solutions but I'm afraid they are not suitable for this problem you're having (the same as solution 4).