鱼C论坛

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

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

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

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

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

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

void main()
{
      void sort(char *name[], int n);
      void print(char *name[], int n);

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

      sort(name, n);
      print(name, n);
}

void sort(char *name[], int n)
{
      char *temp;
      int i, j, k;

      for( i=0; i < n-1; i++ )
      {
            k = i;

            for( j=i+1; j < n; j++ )
            {
                  if( strcmp(name[k], name[j]) > 0 )
                  {
                        k = j;
                  }
                  if( k != i )
                  {
                        temp = name[i];
                        name[i] = name[k];
                        name[k] = temp;
                  }
            }
      }
}

void print(char *name[], int n)
{
      int i;
     
      for( i=0; i < n; i++ )
      {
            printf("%s\n", name[i]);
      }
}
  

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

不是太理解

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

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

void main()
{
      void sort(char *name[], int n);
      void print(char *name[], int n);

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

      sort(name, n);
      print(name, n);
}

void sort(char *name[], int n)
{
      char *temp;
      int i, j, k;

      for( i=0; i < n-1; i++ )
      {
            k = i;

            for( j=i+1; j < n; j++ )
            {
                  if( strcmp(name[k], name[j]) > 0 )
                  {
                        k = j;
                  }
                  if( k != i )
                  {
                        temp = name[i];
                        name[i] = name[k];
                        name[k] = temp;
                  }
            }
      }
}

void print(char *name[], int n)
{
      int i;
     
      for( i=0; i < n; i++ )
      {
            printf("%s\n", name[i]);
      }
}

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

发表于 2015-6-19 23:24:46 | 显示全部楼层
至于数字字符串为什么不按小到大排序我也很好奇。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-20 10:43:23 | 显示全部楼层
上边的程序不是按升序输出的,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-20 11:04:08 | 显示全部楼层
if(k!=i)是对上一个if语句的判断,当上一个if语句成立时k=i+1   这时需要交换两者位置
想知道小甲鱼最近在做啥?请访问 -> 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;
                        }
                }
        }
}
改下就对了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

字符串也不是不按小到大排序。很多网站给的是这个代码 但单步调试时 根本就不是按小到大排序
想知道小甲鱼最近在做啥?请访问 -> 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
想知道小甲鱼最近在做啥?请访问 -> 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 ) 这个条件的出现。 是不是我哪里理解错误了。 还是那本身就是个错误的程序
想知道小甲鱼最近在做啥?请访问 -> 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;
                        }
                }
        }
}
是可以的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-21 12:00:37 | 显示全部楼层
我都醉了 怎么都是一些所问非所答的一些人 有什么高手解答一下
想知道小甲鱼最近在做啥?请访问 -> 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]都要交换  那么这个程序还有什么字符串从小到大输出的意义 ,
  怎么就可以的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

大哥你把strcmp函数是什么意思 搞懂在说 你说的完全不明白 你的能把 代码打出来吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-7-11 18:07:05 | 显示全部楼层
if( k != i )是说当k值不等于i是,!=是不等于的意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-26 03:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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