Я создал цикл, который должен шифровать фразы, которые я ему говорю, но не завершился из-за проблемы. Он должен определять, когда я говорю «стоп» в консоли, и закрывать цикл. Не работает. Я хочу, чтобы он определил, сказал ли я «стоп» и разорвал цикл. Я не получу случайных промахов из-за того, что получу буквы из других слов. Как видите, каждый раз, когда буква выходит из строя, она сбрасывает векторы, что блокирует все if, пока 'c' не получит правильные буквы в правильном порядке.

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;
  }
c++
0
Amariei Sebastian Lucian 27 Ноя 2019 в 20:35
3
c - это отдельный char, который вы читаете из пользовательского ввода. Это не может быть s, t, o и p одновременно, но это единственный случай, когда вы изменяете i
 – 
idclev 463035818
27 Ноя 2019 в 20:38
3
Это не может «стать» ничем; вы читаете один символ и никогда не меняете его
 – 
Lightness Races in Orbit
27 Ноя 2019 в 20:43
2
Например, если c равно 's', то первый if разблокируется и делает вектор v [1] = 's', а if остается открытым до тех пор, пока c не будет иметь неправильное значение
 – 
Amariei Sebastian Lucian
27 Ноя 2019 в 20:45
2
Массив («вектор») содержит уже набранные символы «стоп». Вернее, так и было задумано.
 – 
user253751
27 Ноя 2019 в 20:55
2
Вы вводите s, и теперь c содержит 's'. Компьютер проверяет, содержит ли c "s". Это происходит при выполнении оператора if. Компьютер устанавливает v[1]='s';. Затем компьютер проверяет, содержит ли c "t" или v [2] содержит "t". Это не так, поэтому компьютер выполняет оператор else, который снова устанавливает v[1]=0;. Конечный результат: ничего не происходит.
 – 
user253751
27 Ноя 2019 в 20:57

2 ответа

Это должно работать, а не адский код с отступом. Предполагается, что вы вводите по одному символу за раз.

#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;
}
2
bialy 27 Ноя 2019 в 21:10

Следуя вашей логике, вам просто нужно присвоить значения массива v после каждого условия if / else, иначе он просто будет немедленно переназначен на 0. Например, вы сначала назначаете v [1] = 's', а затем сразу после того, как назначаете это к v [1] = 0, потому что if возвращает false в первой итерации. Следующий код должен решить проблему.

#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;
  }
0
Saisai3396 27 Ноя 2019 в 21:14
Танки это очень помогло
 – 
Amariei Sebastian Lucian
27 Ноя 2019 в 21:18