0

我似乎不明白为什么我会得到:

Segmentation fault (core dumped)

将我的“电影”输入电影结构时。这里是否有任何明显的逻辑错误或什么?

随着分段错误,我在 void set_movies() 中的 for 循环似乎只返回 4 个电影提示,而由于 #define NUM_MOVIES 5 而应该返回 5。

万分感谢!

#include <iostream>
#include <string>
#include <sstream>

#define NUM_MOVIES 5

using namespace std;

struct movie{
   string name[];
   double copies[];
   double rating[];
   string description[];
   string genre[];
} films [NUM_MOVIES];

void set_movies();
int which_movies_to_view();
int get_movies();
int rent_movie();
int printmovie();
int choice;

int main(){
    set_movies();
    which_movies_to_view();
    get_movies();
    rent_movie();

    return 0;
}

void set_movies(){
    movie set;

    for(int i=0; i<NUM_MOVIES; i++){
        cout << "Enter movie title: " << endl;
        cin >> set.name[i];
        cout << "Enter how many copies: " << endl;
        cin >> set.copies[i];
        cout << "Enter the rating: " << endl;
        cin >> set.rating[i];
        cout << "Enter a description: " << endl;
        cin >> set.description[i];
        cout << "Enter the genre: " << endl;
        cin >> set.genre[i];
    }
}

int which_movies_to_view(){
    movie set;

    cout << "  " << set.name[1] << set.name[2] << set.name[3] << set.name[4] << set.name[5] << endl;
    cout << "Which movie would you like to view?: [1, 2, 3, 4, or 5]" << endl;
    cin >> choice;

    return choice;
}

int get_movies(){

    movie set;

    if(choice == 1){
       cout << set.name[1] << endl;
    }
    if(choice == 2){
       cout << set.name[2] << endl;
    }
    if(choice == 3){
       cout << set.name[3] << endl;
    }
    if(choice == 4){
       cout << set.name[4] << endl;
    }
    if(choice == 5){
       cout << set.name[5] << endl;
    }

    return 0;
}

int printmovie(){

    int n;
    for(int n = 0; n<NUM_MOVIES; n++)
    cout << films[n].name;
    cout << films[n].copies;
    cout << films[n].rating;
    cout << films[n].description;
    cout << films[n].genre;

    return 0;
}

int rent_movie(){
    movie set;

    if(choice == 1){
            set.copies[0] - 1;
            cout << set.copies[0] << " copies left!" << endl;
    }
    if(choice == 2){
            set.copies[1] - 1;
            cout << set.copies[1] << " copies left!" << endl;
    }
    if(choice == 3){
            set.copies[2] - 1;
            cout << set.copies[2] << " copies left!" << endl;
    }
    if(choice == 4){
            set.copies[3] - 1;
            cout << set.copies[3] << " copies left!" << endl;
    }
    if(choice == 5){
            set.copies[4] - 1;
            cout << set.copies[4] << " copies left!" << endl;
    }

    return 0;
}
4

5 回答 5

6

您将结构的成员声明为空数组,但也声明了这些结构的数组。

我认为你实际上想要这个:

struct movie{
   string name;
   double copies;
   double rating;
   string description;
   string genre;
} films [NUM_MOVIES];

然后使用films[i].movie,films[i].copies等。

于 2013-03-14T01:04:38.437 回答
4

“字符串名称[];” 这定义了空数组,然后当您写入“set.name[i]”时,它会导致核心转储。所以对于结构电影的其他成员。

实际上,您可以使用 gdb 读取核心文件,这将显示核心转储发生的位置。

于 2013-03-14T01:03:10.100 回答
1

您正确使用数据结构的唯一功能是printmovie(). 在其他任何地方你使用类似的东西set.name[i]都是不正确的。此外,您应该[]从结构内的定义中删除 。否则我相信它们被视为指针类型。

于 2013-03-14T01:04:10.893 回答
1

struct可以这样看:

struct Movie
{
   std::string name;
   unsigned int copies;
   double rating;
   std::string description;
   std::string genre;
};

并且由于您使用的是 C++ 并且您可能希望成为大小灵活的电影列表,因此您应该使用std::vector而不是 C 样式的数组:

std::vector<Movie> movies;

然后,您可以vector使用它的push_back方法简单地将新电影添加到其中:

Movie m;
// set m's data members here
movies.push_back(m);

稍后当你想访问这些电影时,你可以把它当作一个数组来对待:

for (int i = 0; i < movies.size(); ++i)
    std::cout << movies[i].name << std::endl;
于 2013-03-14T01:21:36.940 回答
0

这是因为您没有在电影结构中声明数组的大小。请记住,C++ 继承了 C 的许多特性,C 强制在每个函数的开头声明要分配多少内存。

于 2013-03-14T01:15:17.920 回答