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