为什么gets()和scanf输出不同

原题

找最小的字符串 (15 分)
本题要求编写程序,针对输入的N个字符串,输出其中最小的字符串。

输入格式:
输入第一行给出正整数N;随后N行,每行给出一个长度小于80的非空字符串,其中不会出现换行符,空格,制表符。

输出格式:
在一行中用以下格式输出最小的字符串:

Min is: 最小字符串
输入样例:
5
Li
Wang
Zha
Jin
Xian
结尾无空行
输出样例:
Min is: Jin
结尾无空行

#include <stdio.h>
#include <string.h>
int main()
{
    int N,i;
    char a[80],b[80];
    scanf("%d",&N);
    gets(a);
    for(i=1;i<N;i++)
    {
        gets(b);
        if(strcmp(a,b)>0)
        strcpy(a,b);
    }
    printf("Min is: %s",a);
    return 0;
}


运行结果及报错内容

并没有输入空格,但输入少一行,无法正常输出a
但换成scanf就完全正确了

这里加一句getchar()吃掉缓冲区里的回车就好了,不然会被gets读取

scanf("%d", &N);
getchar();
gets(a);