-4

我的代码有问题 - 我收到运行时错误。数组应该只存储 5 个值,但实际上存储更多。

#include <iostream>

using namespace std;


int main()
{

const int num = 5;
string t[num], name;
int m[num], score;

for(int i=0; i < num; i++)
{
    cout << "Enter the name for score # " << i+1 << " :";
    cin >> name;
    t[i] = name;

    for(int j=i; j<= i ;j++)
    {
        cout << "Enter the score for score # " << j+1 << " :";
        cin >> score;
        m[j] = score;
    }
}

for(int i=0; i < num; i++)
    cout << m[i] << endl;

}
4

2 回答 2

2

您没有遇到运行时错误,因为您的数组存储的内容超出了应有的范围。可能是,当您输入名称时,它包含空格。这将使cin >> score;只读第一个字符,将其余字符留在输入缓冲区中。

这是我运行您的代码的结果:

[wolf@Targaryen]:~$ r
Enter the name for score # 1 :Alex
Enter the score for score # 1 :100
Enter the name for score # 2 :Bob
Enter the score for score # 2 :99
Enter the name for score # 3 :Charlie
Enter the score for score # 3 :98
Enter the name for score # 4 :Douglas
Enter the score for score # 4 :97
Enter the name for score # 5 :Evin
Enter the score for score # 5 :96
100
99
98
97
96
[wolf@Targaryen]:~$

但是,您的代码确实存在问题。循环for ( int j=i; j<= i ;j++ )只执行一次,但这不会导致任何错误。

您应该使用以下命令读取您的姓名输入:

getline(cin, name);

然后,您应该通过将留在其中的任何垃圾放入未使用的变量来清除输入缓冲区。

我认为您可以像这样更改代码:

#include <iostream>
#include <cstdio>

using namespace std;


int main()
{   

const int num = 5;
string t[num], name;
int m[num], score;

for(int i=0; i < num; i++)
{   
    cout << "Enter the name for score # " << i+1 << " :";
    getline(cin, name);
    t[i] = name;

    cout << "Enter the score for score # " << i+1 << " :";
    cin >> score;
    m[i] = score;
    getline(cin, name); // This line just clear out the buffer. "name" used as a trash
}   

for(int i=0; i < num; i++)
    cout << t[i] << ": " << m[i] << endl;

}
于 2013-09-10T20:32:13.713 回答
1
for(int j=i; j<= i ;j++)

这段代码零意义你不需要在这里循环。原因是它只会有一次案例。

i = j你要ji那里是因为j永远不会少i

for(int i=0; i < num; i++)
{
    cout << "Enter the name for score # " << i+1 << " :";
    cin >> name;
    t[i] = name;


    cout << "Enter the score for score # " << i+1 << " :";
    cin >> score;
    m[i] = score;

}

这本质上与您编写的内容相同。

编辑更新:

好吧,回答OP实际上在问什么……我想。

只是因为你不包括<string>

这是带有一些优化和错误检查的整个项目。

#include <iostream>
#include <string>

using namespace std;

int main()
{

const int num = 5;
string t[num], test;
int m[num];
bool integer = false; 

for(int i=0; i < num; i++)
{
    cout << "Enter the name for score # " << i+1 << " :";
    cin >> t[i];
    cin.clear();
    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    integer = false; 
    while(integer == false){
       cout << "Enter the score for score # " << i+1 << " :";
       cin >> m[i];
       if(!std::cin.fail())
          integer = true;
       cin.clear();
       cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }

}

for(int i=0; i < num; i++)
    cout << m[i] << endl;

}

我觉得对 name 和 score 变量的需求是没有意义的,你可以直接将它们存储到你的数组中。另外,我会确保你做一些错误检查,看看你什么时候是cin整数,它们实际上是整数而不是字符串。希望这可以帮助。

于 2013-09-10T20:01:35.893 回答