My c++ loop doesn't stop when i tell it to do it through the console

I have made a loop which should encrypt the phrases I tell it to, but didn't finish because of the problem. It should detect when I say "stop" in the console and shut down the loop. It doesn't work. What i want it to do is to detect if i said stop and break the loop. I shouldn t get any random missfires from getting the letters s t o p from other words. As you can see, every time there is a letter out of order, it resets the vectors which locks all of the ifs until 'c' gets the correct letters in the correct order.

using namespace std;

int main()
{
  char c,v[5];
  int i=0;
    while(i!=1)
    {
        cin.get(c);
        if(c=='s' or v[1]=='s')
        {
            v[1]='s';
            if(c=='t' or v[2]=='t')
            {
                v[2]='t';
                if(c=='o' or v[3]=='o')
                {
                    v[3]='o';
                    if(c=='p' or v[4]=='p')
                    {
                        v[4]='p';
                        v[1]=v[2]=v[3]=v[4]=0;
                        i=1;
                    }
                    else
                        v[1]=v[2]=v[3]=0;
                }
                else
                    v[1]=v[2]=0;
            }
            else
              v[1]=0;
        }
        cout<<c;
        if (i==1)
            break;
    }
    return 0;
  }

Upvotes: 0

Views: 107

Answers (2)

Saisai3396
Saisai3396

Reputation: 321

Following your logic, you just need to assign the v array values after each if/else condition otherwise it will just get immediately reassigned to 0. For example, you first assign v[1] = 's', and then right after you assign it to v[1] = 0, because the if returns false in first iteration. The following code should solve the problem.

#include <iostream>

using namespace std;

int main()
{
  char c,v[5];
  int i=0;
    while(i!=1)
    {
        cin.get(c);
        if(c=='s' || v[1]=='s')
        {
            if(c=='t' || v[2]=='t')
            {
                if(c=='o' || v[3]=='o')
                {
                    if(c=='p' || v[4]=='p')
                    {
                        v[4]='p';
                        v[1]=v[2]=v[3]=v[4]=0;
                        i=1;
                    }
                    else
                        v[1]=v[2]=v[3]=0;
                    v[3]='o';
                }
                else
                    v[1]=v[2]=0;
                v[2]='t';
            }
            else
              v[1]=0;
            v[1]='s';
        }
        if (i==1)
            break;
    }
    return 0;
  }

Upvotes: 0

bialy
bialy

Reputation: 192

That should the work and is not indented hell code. It assumes that you are entering one character at a time.

#include <iostream>

int main(int argc, char const *argv[])
{
    char keyword[] = "stop";
    char* matching_char = keyword;
    char char_from_user;
    while(*matching_char != '\0')
    {
        std::cin.get(char_from_user);
        // Reset if different character
        if(*matching_char != char_from_user)
            matching_char = keyword;

        // Increment position of match
        if(*matching_char == char_from_user)
            ++matching_char;
        // Ignore rest in buffer
        std::cin.ignore();
    }

    return 0;
}

Upvotes: 2

Related Questions