c++ 。我试图通过在开关内使用数组来获取用户输入,但是当我运行代码时它显示分段错误?

Posted

技术标签:

【中文标题】c++ 。我试图通过在开关内使用数组来获取用户输入,但是当我运行代码时它显示分段错误?【英文标题】:c++ . I'm trying to get user input by using array inside switch but when i run the code it's showing segmentation fault? 【发布时间】:2019-11-17 05:50:22 【问题描述】:

当我选择 switch case 1 并输入详细信息时,它向我展示了!分段故障。我觉得这是因为数组输入。但是如何避免这种情况,或者无论如何要解决这个问题? 问题 - 根据上面的问题 1 和 2,修改程序,使其显示菜单 用户可以选择; 添加新学生 显示学生名单 添加新课程 提供展示课程 用户可以选择安全退出/终止程序。 问题 4 根据上述问题 1 到 3,修改程序,使用户能够 修改所选学生的姓名。

#include <iostream>

#include <string>

using namespace std;

struct  Student

    string name , id , nickname;



    ;
struct  Course

    string ccode,  cname, clecturer;



    ;



int main() 
     int i=0, c=0, ti=0, tc=0;
     Student uniten[i];
     Course cuniten[c];

    cout << "\n \n" << endl;


int choice;
bool gameOn = true;
while (gameOn != false)
cout << "*******************************\n";
cout << " 1 - Add new students.\n";
cout << " 2 - Display student list.\n";
cout << " 3 - Add new course.\n";
cout << " 4 - Display course offered.\n";
cout << " 5 - Exit.\n";
cout << " Enter your choice and press return: ";

cin >> choice;

switch (choice)

case 1:
cout << "Add new students.\n";
i = i+1;
    cout << "\n \n" << endl;

    cout << "Student " << i << endl;

    cout << "Enter Student ID: ";

    cin >> (uniten[i].id);

    cout << "Enter their Name: ";

    cin >> uniten[i].name;

    cout << "Enter their Nickname: ";

    cin >> uniten[i].nickname;
cout << "\n \n" << endl;

break;
case 2:
cout << "Display Student List\n";

break;
case 3:
cout << "Add new course.\n";
c = c+1;

    cout << "\n \n" << endl;

    cout << "Course " << c << endl;

    cout << "Enter Course Code: ";

    cin >> (cuniten[c].ccode);

    cout << "Enter Course Name: ";

    cin >> cuniten[c].cname;

    cout << "Enter Lecturer Name: ";

    cin >> cuniten[c].clecturer;



break;

case 4:
cout << "Display Course List\n";
 for (tc=0; tc<c; tc++) 

    cout << "Course : " << cuniten[i].cname << " Course Code : " << cuniten[i].ccode << ", Lecturer name : " << cuniten[i].clecturer <<endl;

    cout << "\n \n" << endl;

    
break;
case 5:
cout << "End of Program.\n";
gameOn = false;
break;
default:
cout << "Not a Valid Choice. \n";
cout << "Choose again.\n";
cin >> choice;
break;






【问题讨论】:

我对 SO 上另一个问题的回答可能有助于解决您的问题。 ***.com/a/58756962/434551. Student uniten[i]; Course cuniten[c]; 可能由于几个原因而导致重大灾难。首先是 C++ 不允许长度为 0 的数组。第二个是它不允许在运行时使用该语法分配数组。对于动态数组,您需要一个 std::vector 或指针(尽管这不是首选)。 【参考方案1】:
int i=0, c=0, ti=0, tc=0;
     Student uniten[i];
     Course cuniten[c];

在上面的代码中,数组的大小分别为 i=0 和 c = 0。

case 1:
cout << "Add new students.\n";
i = i+1;
    cout << "\n \n" << endl;

    cout << "Student " << i << endl;

    cout << "Enter Student ID: ";

    cin >> (uniten[i].id);

    cout << "Enter their Name: ";

    cin >> uniten[i].name;

    cout << "Enter their Nickname: ";

    cin >> uniten[i].nickname;
cout << "\n \n" << endl;

在 switch 案例中,您正在更新 i=i+1,它试图访问 uniten[1] 处不存在的索引。

【讨论】:

更糟糕的是:int i = 0 /* or any other value */; Student uniten[i]; 使用 Variable Length Array,这在 C99 标准中是可选的,但在 C++ 中不是。一些编译器在 C++ 中也支持它(作为专有扩展)。但是,它不应该在 C++ 中使用。 (std::vector 是充分的替代品。)而且,长度为 0 的数组会使情况变得更糟...... 谢谢,我明白了!但是如何根据用户输入的数量来声明大小。我无法得到那部分。 你应该使用 std::vector 而不是数组

以上是关于c++ 。我试图通过在开关内使用数组来获取用户输入,但是当我运行代码时它显示分段错误?的主要内容,如果未能解决你的问题,请参考以下文章

C ++试图通过getline函数为函数调用获取用户输入值

C++:使用函数为二维数组分配内存时出错

Java - 如何在开关盒中存储数组

通过在 iPhone 上的网页上输入用户名和密码来获取 html 代码

使用用户输入初始化数组

从文件中删除单词每次用户输入要删除的单词并将新数组写入新文件。 C++