小羊也疯狂 2018-03-18 02:22 采纳率: 100%
浏览 867
已采纳

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");
}
  • 写回答

3条回答 默认 最新

  • sun971782067 2018-03-18 02:42
    关注
    1. scanf方法读取评分后,会把换行符留在缓冲区中,然后在下一次while循环时,gets方法读取到的title就是一个空字符串,也就说movies[i].title[0] != '\0'的结果为false,所以会跳出循环。
    2. gets方法读入成功,返回与参数buffer相同的指针;读入过程中遇到EOF(End-of-File)或发生错误,返回NULL指针。而第二个表示读入的是否是空字符串
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题