我想运行 YES/NO 循环以使用 vector<string> 输入学生列表并显示它,直到用户选择输入学生姓名

Posted

技术标签:

【中文标题】我想运行 YES/NO 循环以使用 vector<string> 输入学生列表并显示它,直到用户选择输入学生姓名【英文标题】:I want to run a YES/NO loop to enter a list of students using vector<string> and display it until user opts to enter the student name 【发布时间】:2021-10-11 20:58:52 【问题描述】:

这是我的代码,我不明白我在这做错了什么。每次按下“y”或“Y”后,输入字符串不会连续工作。相反,它在第一次输入字符串后一次又一次地显示问题消息。

int main()
    vector<string> v;
    int count=0;
    bool value=true;
    string s;
    char ch;
    cout<<"Start entering the name of the students :- "<<endl;
    while(value)
        getline(cin,s);
        v.push_back(s);
        count++;
        cout<<"Do you want to Enter one more name :- Press 'y/Y' to continue or 'n/N' to end -> ";
        cin>>ch;
        if(ch=='n'||ch=='N') value=false;
    
    cout<<"So, there are total "<<count<<" number of students and their names are :-"<<endl;
    for(auto x:v) cout<<x<<endl;
    return 0;

【问题讨论】:

这能回答你的问题吗? Why does std::getline() skip input after a formatted extraction? 【参考方案1】:

我认为,当我们输入数值时,我们按 Enter,因此 Enter 键也进入输入,但 cin 在输入之前取值并将输入留在流中,因此当我们获得下一个输入时,输入进入并且我们的输入被跳过(空)这是导致问题的原因。

所以我们应该总是使用 cin.ignore();在每个整数输入之后。其他数字输入可能会发生同样的情况。 在您的情况下,它发生在 char 输入上,这也是一个整数输入,因此它是预期的并且它可以工作,您可以查看我提供的解决方案。

int main()
    vector<string> v;
    int count = 0;
    bool value = true;
    string s;
    char ch;
    
    cout<<"Start entering the name of the students :- "<<endl;
    while(value)
        getline(cin,s);
        v.push_back(s);
        count++;
        cout<<"Do you want to Enter one more name :- Press 'y/Y' to continue or 'n/N' to end -> ";
        cin>>ch;
        cin.ignore();
        if(ch == 'n'|| ch == 'N') 
            value = false;
        
    
    cout<<"So, there are total "<<count<<" number of students and their names are :-"<<endl;
    for(auto x:v) cout<<x<<endl;
    return 0;

【讨论】:

您可能需要考虑学生姓名可能包含空格这一事实。 我已经更新了代码,它运行良好:) 谢谢 cin.ignore(); 的位置将使其跳过输入的名字的第一个字母。 所以应该在 cin>>ch 之后; //?? 是的,检查流 (std::cin) 是否处于良好状态也很重要。否则,如果流被用户关闭,程序将无限循环运行。

以上是关于我想运行 YES/NO 循环以使用 vector<string> 输入学生列表并显示它,直到用户选择输入学生姓名的主要内容,如果未能解决你的问题,请参考以下文章

Angular *ngFor 循环遍历数组

Pandas:按类别过滤数据框

Redis配置文件各项参数说明

根据sql中的日期比较返回“YES”/“NO” [重复]

JOptionPane YES/No 选项确认对话框问题

012-Shell 提示确认(Y / N,YES / NO)