C++ c++;进入无止境的循环

C++ c++;进入无止境的循环,c++,visual-c++,C++,Visual C++,下面是我的代码: char name; bool isValid = true; int mode; cout << "Enter name:" << endl; cin >> name; do { cout << "Choose a mode" << endl; cin >> mode; switch (mode) { case 1: iniCharacter (name, 110, 100, 100);

下面是我的代码:

char name;
bool isValid = true;
int mode;

cout << "Enter name:" << endl;
cin >> name;

do
{
cout << "Choose a mode" << endl;
cin >> mode;

switch (mode)
{
case 1:
    iniCharacter (name, 110, 100, 100);
    break;
case 2:
    iniCharacter (name, 100, 110, 100);
    break;
case 3:
    iniCharacter (name, 100, 100, 110);
    break;
default:
    isValid = false;
    cout << "Invalid mode, ";
    break;
}
}while (!isValid);
为什么即使我没有开始向模式输入值,代码也会导致循环


程序不应该等待用户输入“模式”吗?

您可能需要在循环顶部将
isValid
设置为true,以说明在尝试失败后输入有效输入的原因:

isValid = true;

将“名称”的类型更改为“字符串”

非常简单

只需将名称声明更改为

char name[10]  // assuming your name would be 10 characters long.
整个程序运行得很好


希望能有帮助

它将
\n
留在缓冲区中 尝试
while(cin.get()!='\n');

之前执行
循环

使用下面的代码-

char name[100] = {0};
bool isValid = true;
int mode;

cout << "Enter name:" << endl;
cin >> name;

do
{
cout << "Choose a mode" << endl;
cin >> mode;

switch (mode)
{
case 1:
    iniCharacter (name, 110, 100, 100);
    break;
case 2:
    iniCharacter (name, 100, 110, 100);
    break;
case 3:
    iniCharacter (name, 100, 100, 110);
    break;
default:
    isValid = false;
    cout << "Invalid mode, ";
    break;
}
}while (!isValid);
charname[100]={0};
bool isValid=true;
int模式;
姓名;
做
{
cout模式;
开关(模式)
{
案例1:
输入字符(名称,110100100);
打破
案例2:
输入字符(名称,100110100);
打破
案例3:
输入字符(名称,100100110);
打破
违约:
isValid=false;

cout当用户键入名称时,名称将不止一个字符,只有第一个字符进入
name
变量(因为您将其声明为字符)其余的字符放在缓冲区中,它们不是
int
类型,所以它一直在抱怨…看,我已经将类型更改为string,但是输出仍然是same。我已经在GNU/Linux上用string而不是char测试了你的程序,使用gcc,它可以工作,除非你输入的模式小于1或大于3,你会在n无限循环,因为它抱怨
无效模式
,所以将isValid设置为false,即使输入有效的输入,也不会再次将其设置为true。我已将类型更改为string,但输出仍然相同您必须重新编译它不起作用…仍然相同
char name[100] = {0};
bool isValid = true;
int mode;

cout << "Enter name:" << endl;
cin >> name;

do
{
cout << "Choose a mode" << endl;
cin >> mode;

switch (mode)
{
case 1:
    iniCharacter (name, 110, 100, 100);
    break;
case 2:
    iniCharacter (name, 100, 110, 100);
    break;
case 3:
    iniCharacter (name, 100, 100, 110);
    break;
default:
    isValid = false;
    cout << "Invalid mode, ";
    break;
}
}while (!isValid);