C ++循环逻辑错误?

时间:2011-09-16 02:50:58

标签: c++

我在使用C ++逻辑循环时遇到一些麻烦。从测试开始,我认为这是Grades()函数循环中的错误。

基本上该程序应该获得它看起来要做的名称和测试分数,但程序在此之后就会退出,我不知道为什么。只是想知道是否有其他人注意到函数中可能导致程序过早终止的错误。

// Grades
void Grades(char names[][length], double grades[][4])
{
    for(int i = 0; i < amount; i++)
    {
        cout << "Name: ";
        cin.ignore();

        cin.getline(names[i],length, '\n');

        cout << "Test Scores: ";

        for(int k = 0; k < 4; k++)
        {
            int num = 0;

            while(!(cin >> num) ||
                  num  < 0 ||
                  num > 100 ) 
            {
                cout << "invalid entry." << endl;
            }

            grades[i][k] = num;
        }
    }
}

2 个答案:

答案 0 :(得分:3)

咬住每个C ++初学者的错误...... iostream错误是“粘性的”,并且在您在流上调用clear之前一直存在。

while(!(cin>> num) || num  < 0 || num > 100 ) 
{
    cout << "invalid entry." << endl;
    cin.clear(); // reset the error so cin evaluates to true
    cin.ignore( -1 ); // ignore the offending input
}

此外,cin.ignore()之前的getline将忽略名字的第一个字母。

您应该使用std::string代替char数组。

除此之外,只要输入格式正确,程序基本上就可以工作。这是我系统上的输出。请注意,Bob的首字母已被切断,Bob和Jane在其名称后面有未初始化的字符,因为字符数组未被视为C样式的字符串。

Student: ob_???_
Average Score: 60.00 Grade Letter: D

Student: jane   ???_?
Average Score: 70.00 Grade Letter: C

Student: mary
Average Score: 80.00 Grade Letter: B

Student: todd
Average Score: 90.00 Grade Letter: A

Student: alice
Average Score: 100.00 Grade Letter: A

奇怪的是,ideone.com确实运行了程序但由于某种原因没有显示其输出。我不知道。

正如Evan所提到的,如果通过双击运行命令行程序,Windows shell将默认退出。从预先存在的交互式shell运行以查看输出。 system( "pause" );是不可移植的,也是非常糟糕的做法。

答案 1 :(得分:1)

您使用的是哪种编译器/操作系统?

有时在从main返回之前需要添加system("pause");调用。如果您从IDE进行编译而不是直接运行程序,则通常会出现这种情况。您可以通过直接从命令行/ bash / etc运行它来避免此问题。