C++ 当读取int和字符串C++;

C++ 当读取int和字符串C++;,c++,while-loop,cout,cin,C++,While Loop,Cout,Cin,我正在尝试从用户处读取多个字符串和int。我想把姓名和年龄配对,并一直这样做,直到用户键入“完成”。但是我的do-while很早就崩溃了,我不知道为什么 int number; string name; do { cout << "Your name: " ; getline(cin, name); cout <<name<< " age: " ; cin >> number; } while (name!="done"); 整数; 字

我正在尝试从用户处读取多个
字符串
int
。我想把姓名和年龄配对,并一直这样做,直到用户键入“完成”。但是我的
do-while
很早就崩溃了,我不知道为什么

int number;
string name;
do
{
cout << "Your name: " ;
getline(cin, name);    
cout <<name<< " age: " ;
cin >> number;
}
 while (name!="done");
整数;
字符串名;
做
{

cout如果有人进入了无效年龄,即不是数字,您需要清除cin的标志,并刷新所有剩余字符

if( !(cin >> number )
{
     cin.clear();
}
cin.ignore( std::numeric_limits<streamsize>::max() );
if(!(cin>>编号)
{
cin.clear();
}
cin.ignore(std::numeric_limits::max());

如果它确实读取了一个数字,那么您还需要忽略它后面的换行符。

如果有人输入了一个无效的年龄,即某个不是数字的东西,您需要清除cin的标志,并刷新所有剩余的字符

if( !(cin >> number )
{
     cin.clear();
}
cin.ignore( std::numeric_limits<streamsize>::max() );
if(!(cin>>编号)
{
cin.clear();
}
cin.ignore(std::numeric_limits::max());

如果它确实读取了一个数字,那么您还需要忽略它后面的换行符。

我试图在VS 2010中运行您的程序,即使我输入了一个有效的数字,该程序也会跳过读取下一个名称

在我看来,
cin>>数字
并没有吞下我在数字后面自然输入的“\n”

我尝试在每个
cin>>number
之后添加对getchar()的调用,程序令人惊讶地开始按预期工作

因此,结论是,即使输入的数字没有问题,也应该在数字之后清除()/ignore(),或者使用getline()(然后解析)读取数字

如果您不想输入“完成”的年龄,则必须在输入后立即中断循环。我的最终代码:

#include <iostream>
#include <string>

using namespace std;

int main()
{
    int number;
    string name;
    while(true)
    {
        cout << "Your name: " ;
        getline(cin, name);
        if(name == "done") 
            break;
        cout <<name<< " age: " ;
        cin >> number;
        cin.clear();
        cin.ignore(std::numeric_limits<streamsize>::max(),'\n');
    }
}
#包括
#包括
使用名称空间std;
int main()
{
整数;
字符串名;
while(true)
{

cout我试着在VS 2010中运行你的程序,即使我输入了一个有效的数字,程序也会跳过读取下一个名字,这让我感到惊讶

在我看来,
cin>>数字
并没有吞下我在数字后面自然输入的“\n”

我尝试在每个
cin>>number
之后添加对getchar()的调用,程序令人惊讶地开始按预期工作

因此,结论是,即使输入的数字没有问题,也应该在数字之后清除()/ignore(),或者使用getline()(然后解析)读取数字

如果您不想输入“完成”的年龄,则必须在输入后立即中断循环。我的最终代码:

#include <iostream>
#include <string>

using namespace std;

int main()
{
    int number;
    string name;
    while(true)
    {
        cout << "Your name: " ;
        getline(cin, name);
        if(name == "done") 
            break;
        cout <<name<< " age: " ;
        cin >> number;
        cin.clear();
        cin.ignore(std::numeric_limits<streamsize>::max(),'\n');
    }
}
#包括
#包括
使用名称空间std;
int main()
{
整数;
字符串名;
while(true)
{
cout,因为您给它一个字符串,而它期望int为
age

在第一次迭代结束时,当您键入Enter键以输入
age
时,在
cin
中加入了一个额外的换行符。因此,在第二次迭代中,换行符显示为空行,导致
名称
设置为空字符串。然后,程序需要一个int作为
age
。如果您不小心的话如果输入一个字符串,就会导致程序崩溃

一项建议: 取代:

getline(cin, name);  
与:

因为您给它一个字符串,而它期望int为
age

在第一次迭代结束时,当您键入Enter键以输入
age
时,在
cin
中加入了一个额外的换行符。因此,在第二次迭代中,换行符显示为空行,导致
名称
设置为空字符串。然后,程序需要一个int作为
age
。如果您不小心的话如果输入一个字符串,就会导致程序崩溃

一项建议: 取代:

getline(cin, name);  
与:

#包括
#包括
int main()
{
std::字符串名;
智力年龄;
while(true)
{
std::cout>name;
如果(“完成”==名称)
打破
性病:年龄;
std::cout
#包括
#包括
int main()
{
std::字符串名;
智力年龄;
while(true)
{
std::cout>name;
如果(“完成”==名称)
打破
性病:年龄;
std::cout使用std名称空间

这边

int number;
string name;
do
{
std::cout<<"Your name: " ;
std::cin>>name;    
std::cout<<name<<" age: " ;
std::cin>>number;
}
while (name!="done");
整数;
字符串名;
做
{
std::coutname;
std::cout使用std名称空间

这边

int number;
string name;
do
{
std::cout<<"Your name: " ;
std::cin>>name;    
std::cout<<name<<" age: " ;
std::cin>>number;
}
while (name!="done");
整数;
字符串名;
做
{
std::coutname;

std::崩溃时你的输入会是什么?我想知道的是,在询问年龄时,你只需输入一些NaN值。我可以输入两个值,一次是name和age,但第二次,它会打印我最后的输入100万次..“崩溃”?需要详细说明吗?它会一次又一次地打印您上次输入的内容,直到您终止程序…当它崩溃时,您的输入是什么?我想知道的是,在询问年龄时,您只需输入一些NaN值我可以输入两个值,一次输入姓名和年龄,但第二次,它会打印我上次输入的内容100万次..“崩溃”?需要详细说明吗?它会一次又一次地打印您上次输入的内容,直到您终止程序…这给了我一个空格,在输入一个数字后,我必须再输入一个以使程序循环?cin从来都不是我的强项。在实际代码中,我从不使用它。当您输入数字时,它会以换行符终止,我将估计下一次getline调用是否仍保留在缓冲区中,因此您可能需要跳过它(另一次忽略)即使在成功读取之后。这给了我一个空格,在输入一个数字后,我必须再输入一个以使程序循环?cin从来都不是我的强项。在实际代码中,我从不使用它。当您输入数字时,它以换行符终止,我怀疑它是否保留在下次getline调用的缓冲区中,因此您可能需要即使在成功读取之后也要跳过它(另一次忽略)。