带有计数的for和while循环中的C ++ sentinel。陷入无限循环

时间:2015-09-26 04:03:18

标签: c++

我一直陷入无限循环的代码中。我必须这样做,以便您可以使用哨兵退出' q'但迭代次数不超过20次。任何帮助将不胜感激,因为我只是编程新手。

#include <iostream>

using namespace std;

int main()
{
    int option; // If new member or existing member or exit
    char SENTINEL = 'q';
while(option != SENTINEL)
{
    for(int count = 0; count <= 20; count++)
    {   
        // Display menu
        cout << "Welcome to the forum.\n";
        cout << "Are you:\n";
        cout << "1. A new member\n";
        cout << "2. An existing member" << endl;
        cout << "To exit press 'q'\n";
        cin >> option;

        if (option == 1)
        {
            char new_name[20]; // Array to hold new member 

            cout << "You're a new member.\n"; 
            cout << "Please enter your first name followed ";
            cout << "by your last name.\n";
            cout << "Then press return.\n";

            cin >> new_name; // User enter their name
        }
        else if (option == 2)
        {
            cout << "You're an existing member." << endl;
        }
    } 
}
}

7 个答案:

答案 0 :(得分:1)

您需要执行以下操作:

  1. 摆脱while循环。您需要在循环中使用一个具有多个条件或break的循环。
  2. option设为char而不是int。将optionSENTINEL进行比较是没有意义的,因为它们是不同的类型。制作option一个char可以解决此问题。
  3. 使用string类而不是char数组,包含20个元素。名字长度超过20个字符的任何人都将导致缓冲区溢出。 string更安全,如有需要会自动扩展。
  4. #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main()
    {
        char option; // If new member or existing member or exit
        char SENTINEL = 'q';
    
        for(int count = 0; count <= 20; count++)
        {   
            // Display menu
            cout << "Welcome to the forum.\n";
            cout << "Are you:\n";
            cout << "1. A new member\n";
            cout << "2. An existing member" << endl;
            cout << "To exit press 'q'\n";
            cin >> option;
            cin.get(); // discard newline char
    
            if (option == '1')
            {
                string new_name; // string to hold new member 
    
                cout << "You're a new member.\n"; 
                cout << "Please enter your first name followed ";
                cout << "by your last name.\n";
                cout << "Then press return.\n";
    
                getline(cin, new_name); // User enter their name
            }
            else if (option == '2')
            {
                cout << "You're an existing member." << endl;
            }
            else if (option == SENTINEL) {
                break; // break from the loop
            }
        } 
    }
    

答案 1 :(得分:1)

选中此项:需要使用getchar()

获取换行符
#include <iostream>

using namespace std;

int main()
{
    int option; // If new member or existing member or exit
    char SENTINEL = 'q';
while(option != SENTINEL)
{
    for(int count = 0; count <= 20; count++)
    {
        // Display menu
        cout << "Welcome to the forum.\n";
        cout << "Are you:\n";
        cout << "1. A new member\n";
        cout << "2. An existing member" << endl;
        cout << "3. To exit press '3'\n";
        cin >> option;
        getchar();
        if (option == 1)
        {
            char new_name[20]; // Array to hold new member

            cout << "You're a new member.\n";
            cout << "Please enter your first name followed ";
            cout << "by your last name.\n";
            cout << "Then press return.\n";

            cin >> new_name; // User enter their name
        }
        else if (option == 2)
        {
            cout << "You're an existing member." << endl;
        }else if(option == 3)
        {
            exit(0);
        }
    }
}
}

答案 2 :(得分:0)

你的for循环可以有多个条件,以便当count超过20或选项等于'q'时退出。它看起来像这样:

int main()
{
    int option; // If new member or existing member or exit
    char SENTINEL = 'q';

    for(int count = 0; ((count <= 20)&&(option != SENTINEL)); count++)
   {   
       // Display menu
       cout << "Welcome to the forum.\n";
       cout << "Are you:\n";
       cout << "1. A new member\n";
       cout << "2. An existing member" << endl;
       cout << "To exit press 'q'\n";
       cin >> option;

       if (option == '1')
       {
           char new_name[20]; // Array to hold new member 

           cout << "You're a new member.\n"; 
           cout << "Please enter your first name followed ";
           cout << "by your last name.\n";
           cout << "Then press return.\n";

           cin >> new_name; // User enter their name
       }
       else if (option == '2')
       {
           cout << "You're an existing member." << endl;
       }
   } 

}

答案 3 :(得分:0)

还测试for循环中的标记条件?

for(int count = 0; count <= 20 && option != SENTINEL; count++)

请注意,为了避免未定义的行为,您应该将option初始化为某个值(SENTINEL除外),或者您正在处理堆栈中剩余的垃圾。

答案 4 :(得分:0)

首先:

option != SENTINEL这条线没有意义你不能将一个整数与一个字符进行比较,要么你做两个变量 int char 数据类型

char new_name[20];更改为string array,以免遇到很多麻烦。

此外,当用户输入q时,您应该退出循环或程序,以便为什么不使用exit(1)方法。

  char option ;
char SENTINEL = 'q';
while(option != SENTINEL)
{
    // Display menu
    cout << "Welcome to the forum.\n";
    cout << "Are you:\n";
    cout << "1. A new member\n";
    cout << "2. An existing member" << endl;
    cout << "To exit press 'q'\n";
    cin >> option; //<-- 1 and 2 will be char variable 

    if (option == '1')  
    {
        string new_name[20]; 

       for(int count = 0; count < 20; count++)
       {
        cout << "You're a new member.\n"; 
        cout << "Please enter your first name followed ";
        cout << "by your last name.\n";
        cout << "Then press return.\n";

        cin >> new_name[count]; 
      }
    }
    else if (option == '2')
    {
        cout << "You're an existing member." << endl;
    }
    else if (option == 'q')
    {
       exit(1);   // to exit from the loop  
    }
} 

答案 5 :(得分:0)

愿你......

using namespace std;

陷阱

你有几个问题......包括:

  • while():一周中的任何一天都不是个好主意。
  • 你的for循环没有任何意义。它根本不会“覆盖”或以其他方式控制option循环。
  • 如果int属于sentinel类型,则无法注意到std::cin输入。 fail只需设置char[20]位,您就不会注意到它。
  • 你某处std::string。这是堆栈溢出/缓冲区溢出和其他微妙错误的糖,甚至没有提到安全问题... invalid修复了这一点。
  • 布尔标志(例如quitstd::cin.clear())对于摆脱长嵌套循环非常有用。
  • std::cin.ignore()清除任何错误。同时,on_delete允许您忽略先前垃圾输入行的所有内容。
  • “轻微”设计问题遍布整个地方。

答案 6 :(得分:0)

我想补充其他答案,因为

  1. 他们没有解释为什么你在制作&#34;选项&#34;时进入无限循环?和整数而不是char。
  2. 仍有可能存在不良行为。
  3. 1-)试试这个片段:

        int option=-1;
        cout<<"The initial value of option is: "<<option<<endl;
        cout<<"Input a new value, please: "<<endl;
        cin >> option;
        cout<<"After your input, it is: "<<option<<endl;
    

    如果输入一个数字(如123),它将正确接收它的值。如果你输入一个字母(如q),它将变为0.如果你输入一个数字和字母的混合,它将尝试从中提取一个数字,直到你找到一个字母(例如,如果你输入12q34,选项将变为12和&#34; q34&#34;将保留在cin的缓冲区中)

    在您的代码中,无论何时键入&#39; q&#39;,cin都会将选项设置为0,但不会忘记其值。因此,在迭代之后,它不再接受您的任何输入,因为它仍然具有其内存中的先前值并且无法摆脱它。

    2-)那么你应该选择一个字符吗?是的,不是。 如果你这样做,输入&#34; 123&#34;将创建一个名为&#34; 23&#34;的新成员,因为您的程序将采用&#39; 1&#39;来自&#34; 123&#34;,输入新成员的条件,自动转储&#34; 23&#34;命名并立即返回第一个提示。如果这是可以接受的(如果您信任您的用户那么多),请继续。否则,请使用类似std :: string及其compare方法的内容。