程序以接受所有输入而不显示任何内容结束

Program is ending with taking all input and not displaying anything

大家好我正在尝试运行下面的程序但是在接受一个输入后它终止了我不知道为什么? 1 然后在 inputdata 函数中,它只会输入姓名,然后在不显示的情况下终止,当我输入 2 时,首先它将接受学生 1 的完整输入,对于学生 2,它将接受姓名输入,然后终止我什至使用 cin.ignore(); 但后来甚至没有工作。有人可以帮我吗?我是 c++ 初学者,需要您的帮助。

#include <iostream>
using namespace std;

struct Student
{
    string name;
    string course;
    int age;
    int marks;
};

void Inputdata(Student Stu[], int size);
void Display(Student s[], int total);
int main()
{
    int num;
    
    cout<<"How many students are there: ";
    cin>>num;
    
    Student S[num];
    Inputdata(S, num);
    Display(S, num);
    
    return 0;
}

void Inputdata(Student Stu[], int size)
{
    for(int i=1; i<=size; i++)  
    {
        cout<<"Enter data for student #:"<<i<<endl;
        cout<<"Enter Name: ";
        cin>>Stu[i].name;
        cout<<"Enter Course: ";
        cin>>Stu[i].course;
        cout<<"Enter Age: ";
        cin>>Stu[i].age;
        cout<<"Enter marks: ";
        cin>>Stu[i].marks;
    }
}

void Display(Student s[], int total)
{
    int sum;
    for(int j=1; j<=total; j++) 
    {
        cout<<"Information of student #:"<<j<<endl;
        cout<<"Name: "<<s[j].name<<endl;
        cout<<"Course:  "<<s[j].course<<endl;
        cout<<"Enter Age: "<<s[j].age<<endl;
        cout<<"Enter marks: "<<s[j].marks<<endl;    
        sum=+s[j].marks;
    }
    cout<<"Average Marks of class"<<sum/total<<endl;
}

主要问题

主要问题是,在 C++ 中,数组索引从 0 开始,而您的代码从 1 开始数组索引。这意味着如果您有一个包含 3 个元素的数组,则这些元素的索引应该是 0、1、 2,而不是 1、2、3。

当您使用超出数组边界的索引时,您的程序可能会崩溃。所以如果你有一个大小为 3 的数组,最大索引是 2,当你使用 3 作为索引时,你的程序可能会崩溃(或者更糟的是,不会崩溃,而是给你一些从内存中读取的随机值)。

因此,您应该在方法 Inputdata:

中替换此 for 循环
for(int i=1; i<=size; i++) 

for(int i=0; i<size; i++) 

方法Display中的for循环也是如此。通过这些修复,您的程序应该可以编译并且 运行 不会崩溃。

附带问题

在您的Display方法中,平均分数的计算不正确。

  • for 循环中,使用以下代码更新 sum 变量:sum=+s[j].marks;。这意味着“将 sum 设置为 +s[j].marks”。这不会将 s[j].marks 的值添加到 sum,而只会用 s[j].marks 覆盖 sum 的值。因此,您应该使用 sum += s[j].marks,它是 sum = sum + s[j].marks.

    的简写形式
  • sum 变量未初始化。如果您有一个像 int sum; 这样的变量,然后用 sum += some_value 更新这个变量,这可能会产生意想不到的结果。如果 sum 没有被赋予初始值,它可能保存一些随机值,该值由程序的前一部分存储在相同的内存位置。出于这个原因,你应该始终确保你的变量被初始化,例如int sum = 0;.

  • sum 变量的类型为 int。当您想要计算平均值时,这会在最后产生问题。 int 数据类型只能表示整数,而平均值很可能介于两个整数之间。例如,如果 sum3total2,那么 sum/total 就是 1,因为 int 不能表示实际结果 1.5。要解决此问题,您应该使用例如double 而不是 int。一个double可以正确表示1.5。所以你的声明应该是例如double sum = 0.0;.

通过这些修复,您的 Display 方法将如下所示:

    double sum = 0.0;
    for(int j=0; j<total; j++) 
    {
        // ...
        sum+=s[j].marks;
    }
    cout<<"Average Marks of class "<<sum/total<<endl;

补充说明

为了对您的代码提供更多反馈:在您的 main 方法中声明 Student S[num];,其中 num 是从 std::cin 读取的变量。这被称为“可变长度数组”(VLA)。虽然您的编译器可能会接受此代码,但从最严格的意义上讲,它不是有效的 C++ 代码。如果你在启用最大警告的情况下编译你的程序,编译器应该给你以下警告:

warning: ISO C++ forbids variable length array 'S' [-Wvla]
   22 |     Student S[num];
      |             ^

我建议改用 std::vector。这是您的代码在 std::vector:

下的样子
#include <iostream>
#include <vector>

using namespace std;

struct Student {
  string name;
  string course;
  int age;
  int marks;
};

void Inputdata(std::vector<Student> &Stu) {
  for (size_t i = 0; i < Stu.size(); i++) {
    cout << "Enter data for student #:" << i << endl;
    cout << "Enter Name: ";
    cin >> Stu[i].name;
    cout << "Enter Course: ";
    cin >> Stu[i].course;
    cout << "Enter Age: ";
    cin >> Stu[i].age;
    cout << "Enter marks: ";
    cin >> Stu[i].marks;
  }
}

void Display(const std::vector<Student> &s) {
  double sum = 0.0;
  for (size_t j = 0; j < s.size(); j++) {
    cout << "Information of student #:" << j << endl;
    cout << "Name: " << s[j].name << endl;
    cout << "Course:  " << s[j].course << endl;
    cout << "Enter Age: " << s[j].age << endl;
    cout << "Enter marks: " << s[j].marks << endl;
    sum += s[j].marks;
  }
  cout << "Average Marks of class " << sum / s.size() << endl;
}

int main() {
  int num;

  cout << "How many students are there: ";
  cin >> num;

  std::vector<Student> S;
  S.resize(num);
  Inputdata(S);
  Display(S);

  return 0;
}

这样做的原因涉及 C++ 的一些更详细的细节。如果刚开始接触C++,不在意细节,我想跳过这个就好了。

基本上有不同种类的内存,栈和堆(reference)。堆栈保存有关已调用哪些方法、已将哪些参数传递给方法以及已使用哪些局部变量的信息。堆可以容纳任意数据块。通常堆栈比堆小得多。可变长度数组(以及静态长度数组)在堆栈上分配,而 std::vector 在堆上分配内存。因此,当您要存储在数组中的条目数可能非常大时,std::vector 是更好的选择。

支持 std::vector 而不是可变长度数组的另一个原因是 std::vector 提供的辅助函数。例如,std::vector 提供了一个用于获取数组大小的辅助函数,而对于可变长度数组,您必须将长度与数组一起传递给要使用数组的方法。因此,使用 std::vector 可以让您编写更简单的代码。