一道C程序填空题,实在想不出来,求指导

有 N个国家名,要求按字母先后顺序排列(用起泡排序法)后输出。

#define  N  20
#include 
#include 
    void main()
      {  int a[N][30],t[30],i,j,s;
         printf("\n初始数组:\n");
         for (i=0;igets(a[i]);
         for (i=0;i<    (1)    ;i++)     //N-1
             for(j=0;j<   (2)   ;j++)    //N-i-1
                if(      (3)       )          //strcmp(a[ j ] , a[ j + 1 ] )  > 0
                {  strcpy(t,a[j]); 
                   strcpy(a[j],a[j+1]);
                   strcpy(a[j+1],t);
}
         printf("\n排序后:\n");
         for (i=0;iprintf("%s\n",a[i]);
   }

第1和第2空肯定没问题,第3空该填啥,我想了两个小时了也写不出来,我用的strcmp,但测试不成功。而且奇怪的是gets()参数使用整型指针也能成功,而且还能正确输出,求高人解答!

strcmp(a[j], a[j+1]) > 0



```c
#define  N  20
#include <stdio.h>
#include <string.h>
    void main()
      {  char a[N][30],t[30];
        int i,j;
         printf("\n初始数组:\n");
         for (i=0;i<N;i++)
            gets(a[i]);
         for (i=0;i< N - 1 ;i++)     //N-1
             for(j=i+1;j< N  ;j++)    //N-i-1
                if(strcmp(a[i], a[j])> 0 )          //strcmp(a[ j ] , a[ j + 1 ] )  > 0
                {  strcpy(t,a[j]); 
                   strcpy(a[j],a[j+1]);
                   strcpy(a[j+1],t);
}
         printf("\n排序后:\n");
         for (i=0;i<N;i++)
             printf("%s\n",a[i]);
   }
 

```
每轮j都与i进行比较,最小的放到i的位置;
当然可以加个优化,如果一轮都没有交换,那就说明已经排好序了,可以结束排序

冒泡排序算法就好

参考GPT。这是一个使用冒泡排序算法对字符串数组进行排序的C语言程序。

程序中的#define N 20定义了数组a的行数为20。

程序中的主函数main()中,首先使用gets()函数读入20个字符串,然后使用冒泡排序算法对这些字符串进行排序,最后输出排序后的字符串数组。

程序中的冒泡排序算法中,外层循环i从0到N-1,内层循环j从0到N-i-1, 每次比较相邻两个字符串,如果前一一个字符串大于后一一个字符串,则交换它们的位置。这里使用了strcmp)函数对字符串进行比较,如果返回值大于0,则表示前一个字符串大于后一个字符串。

程序中的strcpy()函数用于字符串的复制,将-一个字符 串复制到另一个字符串中。

程序中的printf()函数用于输出字符串数组中的字符串。

//(1) N-1
// (2) N-i-1
// (3) a[j][0] > a[j + 1][0]

#define  N  20
#include <stdio.h>
#include <string.h>
    void main()
      {  char a[N][30],t[30];
        int i,j;
         printf("\n初始数组:\n");
         for (i=0;i<N;i++)
            gets(a[i]);
         for (i=0;i< N - 1 ;i++)     //N-1
             for(j=i+1;j< N  ;j++)    //N-i-1
                if(strcmp(a[i], a[j])> 0 )          //strcmp(a[ j ] , a[ j + 1 ] )  > 0
                {  strcpy(t,a[j]); 
                   strcpy(a[j],a[j+1]);
                   strcpy(a[j+1],t);
}
         printf("\n排序后:\n");
         for (i=0;i<N;i++)
             printf("%s\n",a[i]);
   }

在第3个空中,应该填写strcmp(a[j], a[j + 1]) > 0,因为这是判断a[j]和a[j+1]的字母顺序是否正确的条件,如果不正确则进行交换。

关于gets()函数,它的参数应该是一个字符型数组(字符串)的地址,用于接收用户输入的字符串,而不是整型指针。可能是因为在你的编译环境下,这个错误没有被编译器检测出来,但是在其他环境下可能会报错。正确的写法应该是char a[N][30],这样就能正确接收用户输入的字符串了。

1)N-12)N-i-13)strcmp(a[j],a[j+1])>0   
  //解析第三问:意思就是,a[j]这个字符串大于a[j+1]返
回值就是大于0的,那就执行交换,里面的比较,就是按第
一个字符开始比较的,相等的话依次进行比较下去,碰到
相等就返回一个数值,两个字符串相等返回0,第一个大于
第二个就返回正数,第一个小于第二个旧返回负数。
不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

可以直接比较的呀

a[j][0] > a[j + 1][0]

第3空应该填写:strcmp(a[j], a[j+1]) > 0。
原因是,strcmp函数用于比较两个字符串的大小,如果第一个字符串小于第二个字符串,则返回负数;如果第一个字符串等于第二个字符串,则返回0;如果第一个字符串大于第二个字符串,则返回正数。因此,当a[j]大于a[j+1]时,应该进行交换。
另外,gets函数用于从标准输入流中读取一行字符串,并将其存储在指定的字符数组中。其参数应该是字符数组类型的指针,而不是整型指针。虽然在某些编译器中可能会将整型指针隐式转换为字符数组类型的指针,但这种做法是不规范的,容易引起错误。因此,应该将gets函数的参数改为字符数组类型的指针。

img