c语言字符串排序,为什么gets前面那份for循环i=-1开始,能正常跑,而从i=0开始就不能正常跑

#include<stdio.h>
#include<string.h>
void sort(char c[][20],int n){
int i,j,k;
char t[20];
for(i=0;i<n;i++){
k=i;
for(j=i+1;j<n;j++){
if(strcmp(c[k],c[j])>0){
k=j;
}
}
if(k!=i){
strcpy(t,c[i]);
strcpy(c[i],c[k]);
strcpy(c[k],t);
}
}
}
int main(){
int i,n;
char c[20][20];
scanf("%d",&n);
for(i=-1;i<n;i++){ /这里为什么从i=0开始会少录一串/
gets(c[i]);
}
sort(c,n);
for(i=0;i<n;i++){
printf("%s\n",c[i]);
}
}

应该是因为读取整数到变量n中时,scanf()函数丢弃了一个换行符到缓冲区,然后被gets()函数读取到二维数组第一行中去了,所以导致看上去for循环使用gets()函数读取字符串到二维字符数组时,好像少了一个,在scanf()函数后使用一个getchar()读取它丢弃的换行符即可,修改如下:

参考链接:
关于scanf函数吃掉回车符四种办法_Hunter_Kevin的博客-CSDN博客_scanf 回车
c语言中gets()的详细用法 - 木&子 - 博客园

#include<stdio.h>
#include<string.h>
void sort(char c[][20],int n){
    int i,j,k;
    char t[20];
    for(i=0;i<n;i++){
        k=i;
        for(j=i+1;j<n;j++){
            if(strcmp(c[k],c[j])>0){
                k=j;
            }
        }
        if(k!=i){
            strcpy(t,c[i]);
            strcpy(c[i],c[k]);
            strcpy(c[k],t);
        }
    }
}
int main(){
    int i,n;
    char c[20][20];
    // https://blog.csdn.net/Hunter_Kevin/article/details/117266393
    scanf("%d",&n);
    getchar();
    for(i=0;i<n;i++){ //这里为什么从i=0开始会少录一串/
        //scanf("%s",c[i]);
        //  https://www.cnblogs.com/lyxcode/p/7499496.html
        gets(c[i]);
    //    printf("c[%d]=%s\n",i,c[i]);
        
    }
    sort(c,n);
    for(i=0;i<n;i++){
        printf("%s\n",c[i]);
    }
}

img

这是因为输入流的问题你在scanf输入后回车在第一次gets会接收到这一回车信息默认结束就跳过一次,你要么在输入n后面紧跟输入字符串,要么在for函数与scanf中间加个getchar()截取一下前面的输入流;