为什么这个循环不能正常工作?

时间:2014-11-10 23:12:39

标签: c++ string loops while-loop

我已经在这里工作了好几个小时但是我希望能够增加另一位潜水员,我唯一要表现的就是被评判的潜水员人数和他们在这个问题上可以做的平均分数是固定的。

它运行但是当它绕过时,它会跳过城市,并最终在第二次到第三次崩溃。 有人可以帮忙吗?

#include <iostream>
#include <string>
#include <sstream>
using namespace std;

int main(){
    string name;
    string city;
    double judge[4];

    double total = 0;
    double score;
    int divers = 1;
    int x = 0;
    int y = 1;

    do{
        cout << "Please enter divers name: ";
        getline(cin, name);
        cout << "Enter the diver's city: ";
        getline(cin, city);

        do{
            cout << "Enter the score given by judge #" << y << ": " ;
            cin >> judge[x];

            total = total + judge[x];

            y++;
            x++;
        } while(y < 6);

        y = 1;

        cout << "Divers?";
        cin >> divers;

    } while(divers == 1);

    cout << city << endl;
    cout << name << endl;
    cout << total << endl;
    cout << judge[0] << endl;
    cout << judge[1] << endl;
    cout << judge[2] << endl;
    cout << judge[3] << endl;
    cout << judge[4] << endl;

    system("PAUSE");
}

2 个答案:

答案 0 :(得分:2)

索引从0开始声明judge[4]表示你有judge个索引为0 1 2 3.你正在访问数组的末尾。

答案 1 :(得分:0)

当您执行cin >> divers;时,不会从输入中删除行尾字符,只是导致它的数字。然后,当您下次请求std::getline()行时,它只返回已存在的行尾字符,并且不会等待您的新输入。

因此,当您在cin >> drivers样式输入之前进行std::getline()样式输入输入时,您需要阅读超过行尾字符。

一种方法是使用ignore()函数:

do{
    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

    cout << "Please enter divers name: ";
    getline(cin, name);
    cout << "Enter the diver's city: ";
    getline(cin, city);

    // ...

另一种方法是在std::ws来电中使用空白食客std::getline()

do{
    cout << "Please enter divers name: ";
    getline(cin >> std::ws, name);
    cout << "Enter the diver's city: ";
    getline(cin >> std::ws, city);

    // ...

严格来说,只有第一个是必要的。请记住,白色空间食用者会占用您在getline()中键入的所有初始空格,因此如果使用该技术,则无法读取前导空格。