鱼C论坛

 找回密码
 立即注册
查看: 2513|回复: 15

c 字符串从小到大输出的问题

[复制链接]
发表于 2015-6-19 17:56:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include <stdio.h>
  2. #include <string.h>

  3. void main()
  4. {
  5.       void sort(char *name[], int n);
  6.       void print(char *name[], int n);

  7.       char *name[] = {"Fishc.com", "www.fishc.com", "home.fishc.com", "Fishc.com/dz"};
  8.       int n = 4;

  9.       sort(name, n);
  10.       print(name, n);
  11. }

  12. void sort(char *name[], int n)
  13. {
  14.       char *temp;
  15.       int i, j, k;

  16.       for( i=0; i < n-1; i++ )
  17.       {
  18.             k = i;

  19.             for( j=i+1; j < n; j++ )
  20.             {
  21.                   if( strcmp(name[k], name[j]) > 0 )
  22.                   {
  23.                         k = j;
  24.                   }
  25.                   if( k != i )
  26.                   {
  27.                         temp = name[i];
  28.                         name[i] = name[k];
  29.                         name[k] = temp;
  30.                   }
  31.             }
  32.       }
  33. }

  34. void print(char *name[], int n)
  35. {
  36.       int i;
  37.      
  38.       for( i=0; i < n; i++ )
  39.       {
  40.             printf("%s\n", name[i]);
  41.       }
  42. }
复制代码

  

当中if( k != i )是什么意思和意义

不是太理解

我把字符串改为数字 来演算该程序 结果 并不是按从小到大 输出

我修改的
  1. #include <stdio.h>
  2. #include <string.h>

  3. void main()
  4. {
  5.       void sort(char *name[], int n);
  6.       void print(char *name[], int n);

  7.       char *name[] = {"2", "6", "3", "4"};
  8.       int n = 4;

  9.       sort(name, n);
  10.       print(name, n);
  11. }

  12. void sort(char *name[], int n)
  13. {
  14.       char *temp;
  15.       int i, j, k;

  16.       for( i=0; i < n-1; i++ )
  17.       {
  18.             k = i;

  19.             for( j=i+1; j < n; j++ )
  20.             {
  21.                   if( strcmp(name[k], name[j]) > 0 )
  22.                   {
  23.                         k = j;
  24.                   }
  25.                   if( k != i )
  26.                   {
  27.                         temp = name[i];
  28.                         name[i] = name[k];
  29.                         name[k] = temp;
  30.                   }
  31.             }
  32.       }
  33. }

  34. void print(char *name[], int n)
  35. {
  36.       int i;
  37.      
  38.       for( i=0; i < n; i++ )
  39.       {
  40.             printf("%s\n", name[i]);
  41.       }
  42. }
复制代码


所以请教一下 到底为什么if( k != i )

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-6-19 22:57:26 | 显示全部楼层
strcmp(字符数组名1,字符数组名2)按照ASCII码顺序比较两个数组中字符串,并返回比较结果当字符串1=字符串2是返回值0当字符串1>字符串2返回值>0当字符串1<字符串2时返回值<0
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-19 23:24:46 | 显示全部楼层
至于数字字符串为什么不按小到大排序我也很好奇。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-20 10:43:23 | 显示全部楼层
上边的程序不是按升序输出的,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-20 11:04:08 | 显示全部楼层
if(k!=i)是对上一个if语句的判断,当上一个if语句成立时k=i+1   这时需要交换两者位置
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-20 11:06:25 | 显示全部楼层
void sort(char *name[], int n)
{
        char *temp;
        int i, j;
       
        for(i=0; i < n-1; i++)
        {
               
               
                for(j = i+1;j < n; j++)
                {
                        if(strcmp(name[i],name[j]) > 0)
                        {
                                temp = name[i];
                                name[i] = name[j];
                                name[j] = temp;
                        }
                }
        }
}
改下就对了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-20 21:26:18 | 显示全部楼层
桃花飞舞 发表于 2015-6-19 23:24
至于数字字符串为什么不按小到大排序我也很好奇。

字符串也不是不按小到大排序。很多网站给的是这个代码 但单步调试时 根本就不是按小到大排序
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-20 21:37:22 | 显示全部楼层
溯月0503 发表于 2015-6-20 11:04
if(k!=i)是对上一个if语句的判断,当上一个if语句成立时k=i+1   这时需要交换两者位置

上一个if语句成立时k=i+1 是什么意思。  当k!=i 就交换。  这个条件在如果第一次k被赋值为j的时候  是name[k]>name[j]   要交换,但只要k!=i 这个条件完全没有意义。 只要k被赋值过一次。在嵌套的第二个for循环中 k肯定不等于i啊 直到i在加1外面的循环 k才会重新等于i
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-20 21:40:46 | 显示全部楼层
桃花飞舞 发表于 2015-6-20 11:06
void sort(char *name[], int n)
{
        char *temp;

我知道这样改是对  。我只是不明白为什么if( k != i ) 这个条件的出现,而且在很多的网站给的标准答案中都有if( k != i ) 这个条件的出现。 是不是我哪里理解错误了。 还是那本身就是个错误的程序
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-21 09:08:08 | 显示全部楼层
基于 :在嵌套的第二个for循环中 k肯定不等于i啊 直到i在加1外面的循环 k才会重新等于i .得到
void sort(char *name[], int n)
{
        char *temp;
        int i,j,k;
       
        for(i=0;i < n-1;i ++)
        {
                for(j=i+1;j < n; j ++)
                {                        k = i;
                        if(strcmp(name[k], name[j])>0)
                        {
                                k = j;
                        }
                        if( k!=i)
                        {
                                temp = name[i];
                                name[i]=name[k];
                                name[k]=temp;
                        }
                }
        }
}
是可以的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-21 12:00:37 | 显示全部楼层
我都醉了 怎么都是一些所问非所答的一些人 有什么高手解答一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-21 12:03:44 | 显示全部楼层
桃花飞舞 发表于 2015-6-21 09:08
基于 :在嵌套的第二个for循环中 k肯定不等于i啊 直到i在加1外面的循环 k才会重新等于i .得到
void sort(c ...

那么不管name[k]是否大于 name[j]  name[i]和name[k]都要交换  那么这个程序还有什么字符串从小到大输出的意义 ,
  怎么就可以的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-21 14:56:51 | 显示全部楼层
楼主说的对啊,问题是里边这句 k=i;应该在第二个for里边,第一个for 控制下沉趟数,第二个for控制每趟参与比较的元素个数.
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-21 15:33:16 | 显示全部楼层
内层控制的是参与比较的字符串个数 首先改k = i 到内层循环,即每两个字符串比较前 if( k != i)  是有效的。你觉得strcmp 的返回值是什么?strcmp返回的是字符串第一个不相同字符ASCII码的差值。也可以说strcmp -1 0 1.  外层控制循环趟数 内层控制的是参与比较的字符串个数吧 然后(我是新手)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-7-9 12:48:30 | 显示全部楼层
桃花飞舞 发表于 2015-6-21 15:33
内层控制的是参与比较的字符串个数 首先改k = i 到内层循环,即每两个字符串比较前 if( k != i)  是有效的 ...

大哥你把strcmp函数是什么意思 搞懂在说 你说的完全不明白 你的能把 代码打出来吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-7-11 18:07:05 | 显示全部楼层
if( k != i )是说当k值不等于i是,!=是不等于的意思
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-20 09:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表