C++ 我的c++;循环不';当我告诉它通过控制台做这件事时,它不会停止

C++ 我的c++;循环不';当我告诉它通过控制台做这件事时,它不会停止,c++,C++,我已经做了一个循环,它应该加密我告诉它的短语,但由于问题没有完成。它应该检测我在控制台中何时说“停止”,并关闭循环。它不起作用。 我想让它做的是检测我是否说停止并打破循环。我不应该因为从其他单词中获取字母s t o p而产生任何随机错误。正如您所看到的,每当有一个字母出现顺序错误时,它都会重置向量,从而锁定所有ifs,直到“c”以正确的顺序获得正确的字母 using namespace std; int main() { char c,v[5]; int i=0; while(

我已经做了一个循环,它应该加密我告诉它的短语,但由于问题没有完成。它应该检测我在控制台中何时说“停止”,并关闭循环。它不起作用。 我想让它做的是检测我是否说停止并打破循环。我不应该因为从其他单词中获取字母s t o p而产生任何随机错误。正如您所看到的,每当有一个字母出现顺序错误时,它都会重置向量,从而锁定所有ifs,直到“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;
  }
使用名称空间std;
int main()
{
字符c,v[5];
int i=0;
而(i!=1)
{
cin.get(c);
如果(c='s'或v[1]='s')
{
v[1]='s';
如果(c=='t'或v[2]='t')
{
v[2]='t';
如果(c='o'或v[3]='o')
{
v[3]='o';
如果(c=='p'或v[4]=='p')
{
v[4]='p';
v[1]=v[2]=v[3]=v[4]=0;
i=1;
}
其他的
v[1]=v[2]=v[3]=0;
}
其他的
v[1]=v[2]=0;
}
其他的
v[1]=0;
}

cout这应该是有效的,不是缩进的地狱代码。它假设您一次输入一个字符

#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;
}
#包括
int main(int argc,char const*argv[]
{
字符关键字[]=“停止”;
字符*匹配字符=关键字;
来自用户的字符;
while(*匹配字符!='\0')
{
标准::cin.get(来自用户的字符);
//如果字符不同,则重置
if(*匹配字符!=来自用户的字符)
匹配字符=关键字;
//增加匹配位置
if(*匹配的字符==来自用户的字符)
++匹配字符;
//忽略缓冲区中的rest
std::cin.ignore();
}
返回0;
}

这应该是有效的,不是缩进的地狱代码。它假定您一次输入一个字符

#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;
}
#包括
int main(int argc,char const*argv[]
{
字符关键字[]=“停止”;
字符*匹配字符=关键字;
来自用户的字符;
while(*匹配字符!='\0')
{
标准::cin.get(来自用户的字符);
//如果字符不同,则重置
if(*匹配字符!=来自用户的字符)
匹配字符=关键字;
//增加匹配位置
if(*匹配的字符==来自用户的字符)
++匹配字符;
//忽略缓冲区中的rest
std::cin.ignore();
}
返回0;
}

按照您的逻辑,您只需要在每个if/else条件之后分配v数组值,否则它将立即被重新分配到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;
  }
#包括
使用名称空间std;
int main()
{
字符c,v[5];
int i=0;
而(i!=1)
{
cin.get(c);
如果(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;
}
其他的
v[1]=v[2]=v[3]=0;
v[3]='o';
}
其他的
v[1]=v[2]=0;
v[2]='t';
}
其他的
v[1]=0;
v[1]='s';
}
如果(i==1)
打破
}
返回0;
}

按照您的逻辑,您只需要在每个if/else条件之后分配v数组值,否则它将立即被重新分配到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;
  }
#包括
使用名称空间std;
int main()
{
字符c,v[5];
int i=0;
而(i!=1)
{
cin.get(c);
如果(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;
}
其他的
v[1]=v[2]=v[3]=0;
v[3]='o';
}
其他的
v[1]=v[2]=0;
v[2]='t';
}
其他的
v[1]=0;
v[1]='s';
}
如果(i==1)
打破
}
返回0;
}

c
是从用户输入中读取的单个
char
。它不能同时是
s
t
o
p
,但这是您修改
i
它不能“变”的唯一情况任何内容;读取一个字符,然后永不更改。例如,如果c为“s”,则第一个if将被解锁,并使向量v[1]=“s”,if将保持打开状态,直到c出现错误value@drescherjm数组(“向量”)包含“stop”字符已经键入的。或者更确切地说,它是用来。您键入
s
,现在c包含“s”。计算机会检查c是否包含“s”。这样它会运行if语句。计算机设置
v[1]='s';
。然后计算机会检查c是否包含“t”或v[2]包含“t”。因此计算机不会再次运行“else”语句,该语句将
v[1]=0;
设置为0。最终结果:什么也不会发生。
c
是从用户输入读取的单个
char
。它可以