c primer Plus上的一段代码有点看不懂

1.为什么把那句话注释掉以后输入评分会直接跳出循环?
2.gets(movies[i].title) != NULL && movies[i].title[0] != '\0'这个怎么理解,有什么用,两者有什么区别?

 #include <stdio.h>

#define Tsize 45
#define FMAX 2
struct film {
    char title[Tsize];
    int rating;
};

int main() {
    struct film movies[FMAX];
    int i = 0;
    int j;
    puts("Enter first movie title:");
    while (i < FMAX && gets(movies[i].title) != NULL && movies[i].title[0] != '\0') {
        puts("enter your ratings");
        scanf("%d", &movies[i++].rating);
//       while (getchar() != '\n'){
//           continue;
//        }

        puts("enter next movies title (empty line to stop)");
    }
    if (i == 0) {
        printf("no data entered ");
    } else {
        printf("here  is the list: \n ");
    }
    for(j=0;j<i;j++){
        printf("movies:%s Rating: %d\n",movies[j].title,movies[j].rating);
    }
    printf("bye");
}
  1. scanf方法读取评分后,会把换行符留在缓冲区中,然后在下一次while循环时,gets方法读取到的title就是一个空字符串,也就说movies[i].title[0] != '\0'的结果为false,所以会跳出循环。
  2. gets方法读入成功,返回与参数buffer相同的指针;读入过程中遇到EOF(End-of-File)或发生错误,返回NULL指针。而第二个表示读入的是否是空字符串

1、注释掉以后:scanf按照格式化输入`接收了你输入的数字,但是回车符没有接收,而是在标准输入(stdin)缓存里,while中gets函数执行时首先读入了回车符,这时候movies[i].title[0]里面是0,所以while循环不执行
2、gets(movies[i].title) != NULL && movies[i].title[0] != '\0',即成功读取一行输入到movies[i].title(gets读入错误返回NULL)并且串movies[i].title不为空串(即用户只输入了回车)

第个是是防止未输入,第二个是输入的第一个不能为零