我一直陷入无限循环的代码中。我必须这样做,以便您可以使用哨兵退出' 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;
}
}
}
}
答案 0 :(得分:1)
您需要执行以下操作:
while
循环。您需要在循环中使用一个具有多个条件或break
的循环。option
设为char而不是int
。将option
与SENTINEL
进行比较是没有意义的,因为它们是不同的类型。制作option
一个char
可以解决此问题。string
类而不是char
数组,包含20个元素。名字长度超过20个字符的任何人都将导致缓冲区溢出。 string
更安全,如有需要会自动扩展。#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
修复了这一点。quit
和std::cin.clear()
)对于摆脱长嵌套循环非常有用。std::cin.ignore()
清除任何错误。同时,on_delete
允许您忽略先前垃圾输入行的所有内容。答案 6 :(得分:0)
我想补充其他答案,因为
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方法的内容。