我是编程新手,并且一直在使用函数。因此,我决定制作一个简单的程序,以获取用户所看电影的得分。

有问题的代码不完整;但在进行测试时遇到错误:

#include <stdio.h>
#include <stdlib.h>
FILE * fptr;

struct movie_show
{
    char movie_title[50];
    float movie_story, movie_characters, movie_art;
    float average_score;
};

/*************************************************************************/

int main()
{
    printf("[MOVIE RATER]\n\n");

    NumMovie();
    RatingMovie();

    printf("\n\n");
    getch();
    return 0;
}

/*************************************************************************/

void NumMovie()
{
    int num_movie;

    printf("How many movies would you like to rate: ");
    scanf(" %d", &num_movie);

        if(num_movie < 1)
        {
            exit(0);
        }

    RatingMovie(num_movie);

}

/**************************************************************************/

void RatingMovie(int num_movie)
{
    int i;
    struct movie_show mov_show[num_movie];

    for (i = 0; i < num_movie; i++)
    {

        printf("movie #%d", i + 1);
        getchar();
        printf("\nTitle: ");
        fgets(mov_show[i].movie_title, 50, stdin);
        scanf(" %s", mov_show[i].movie_title);

        printf("\nBased on a 1-10 rating scale, how would you rate the: ");
        printf("\nStory: ");
        scanf(" %f", &mov_show[i].movie_story);

    }



}


该函数尤其使程序在执行循环后停止:

void RatingMovie(int num_movie)
{
    int i;
    struct movie_show mov_show[num_movie];

    for (i = 0; i < num_movie; i++)
    {

        printf("movie #%d", i + 1);
        getchar();
        printf("\nTitle: ");
        fgets(mov_show[i].movie_title, 50, stdin);
        scanf(" %s", mov_show[i].movie_title);

        printf("\nBased on a 1-10 rating scale, how would you rate the: ");
        printf("\nStory: ");
        scanf(" %f", &mov_show[i].movie_story);

    }



}


先感谢您。

最佳答案

在您的main()中,您致电

   RatingMovie();


但是RatingMovie的定义是

void RatingMovie(int num_movie);


表示RatingMovie()需要一个int作为参数。

由于您没有在RatingMovie()中进行校准之前未声明main(),因此此时编译器认为RatingMovie不带参数并返回int。

在运行时,当程序从RatingMovie()调用main()时,RatingMovie(int num_movie)收到垃圾作为其num_movies参数,从而导致未定义的行为。在这种情况下,您的程序将崩溃,可能是因为num_movie为负数或非常大。

其他问题是恕我直言:


您在代码中两次调用RatingMovie()。选一个。
struct movie_show mov_show[num_movie]; num_movie不是常数,这是非标准的C。对于电影的最大值使用常数,或者使用calloc()malloc()分配数组
exit(0);调用NumMovie()不是很优雅。作为应用程序正常流程的一部分,必须有一种更优雅的方式来处理退出。


如果将所有函数体移到main()之前,并对函数进行重新排序并修复所有问题,直到编译器不再发出警告,则程序应该可以正常运行。

关于c - 调用使用“for”循环填充全局结构数据的函数时出现运行时错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44700171/

10-11 16:44