我是编程新手,并且一直在使用函数。因此,我决定制作一个简单的程序,以获取用户所看电影的得分。
有问题的代码不完整;但在进行测试时遇到错误:
#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/