【问题标题】:While loop breaks early虽然循环提前中断
【发布时间】:2021-12-22 09:50:48
【问题描述】:

我制作了一个程序,要求提供学生信息(姓名、课程和年级),它被配置为在课程或学生的输入名称为stop时中断

这是我的代码:

#include <iostream>
#include <vector>

using namespace std;

int main() {

    vector<string> v;
    string name;
    string course;
    string grade;

    while (name != "stop") {
        cout << "Please type a student name: ";
        getline(cin, name);

        if (name != "stop") {
            v.push_back(name);
        }

        while (course != "stop") {
            cout << "Please type a course name: ";
            getline(cin, course);
            if (course != "stop") {
                v.push_back(course);
            }
            if(course != "stop" == 0){
                break;
            }
            else {
                cout << "Please type the grade: ";
                getline(cin, grade);
                v.push_back(grade);
            }
        }
    }



    //for (auto iter = v.begin(); iter != std::prev(v.end()); ++iter){
    //    std::cout << *iter << std::endl;
    //}

    return 0;
}

我希望程序在第一个学生课程被称为“停止”时询问新学生,但这只是意味着每当输入新学生姓名时,“课程”的 while 循环会保持“中断”,因为最后输入的课程是“停止”。

关于如何解决这个问题的任何想法?

对不起,如果问题阐述得不好,如果您需要更多说明,请告诉我!

谢谢:)

【问题讨论】:

  • 您必须在 while 循环之后重置 course 以保持您的 while 循环不变。 https://en.cppreference.com/w/cpp/string/basic_string/clear
  • 附注:if(course != "stop" == 0) 应该是 if(course == "stop")。我建议使用do..while 循环来消除冗余字符串检查。您应该检查getline() 是否失败,例如,以防用户键入 Ctrl-C。
  • 好点了..虽然您不需要重置,因为用户输入是在检查之前进行的。
  • 我的clean up
  • 为此,您应该提出一个全新的问题并展示您尝试的解决方案。

标签: c++ string if-statement vector while-loop


【解决方案1】:

对于初学者来说,这个 if 语句

    if (name != "stop") {

应扩大并包括应重写为 do while 循环的内部 while 循环。

例如

while (name != "stop") {
    cout << "Please type a student name: ";
    getline(cin, name);

    if (name != "stop") {
        v.push_back(name);

        do
        {
            cout << "Please type a course name: ";
            getline(cin, course);

            if (course != "stop") {
                v.push_back(course);
                cout << "Please type the grade: ";
                getline(cin, grade);
                v.push_back(grade);
            }
        } while ( course != "stop" );
    }
}

正如 @Remy Lebeau 在评论中所写,外部 while 循环也可以重写为 do-while 循环。

【讨论】:

  • 你也可以使用do..while 作为外循环。
【解决方案2】:

您可以在 if 中将 course 变量设置为空字符串 "",在其中中断内部 while 循环。

像这样:

if(course == "stop") {
    course = "";
    break;
}

【讨论】:

  • 更喜欢使用course.clear(); 而不是course = "";
  • 我建议在内部循环之前或之后清除course,而不是在循环内部。
  • 这并不重要,因为下一次读取会为此变量设置新值。
猜你喜欢
  • 2019-08-26
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 2021-07-12
  • 1970-01-01
  • 2011-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多