笨小孩KK 发表于 2015-6-19 17:56:26

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

#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, name) > 0 )
                  {
                        k = j;
                  }
                  if( k != i )
                  {
                        temp = name;
                        name = name;
                        name = temp;
                  }
            }
      }
}

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



当中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, name) > 0 )
                  {
                        k = j;
                  }
                  if( k != i )
                  {
                        temp = name;
                        name = name;
                        name = temp;
                  }
            }
      }
}

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


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

桃花飞舞 发表于 2015-6-19 22:57:26

strcmp(字符数组名1,字符数组名2)按照ASCII码顺序比较两个数组中字符串,并返回比较结果当字符串1=字符串2是返回值0当字符串1>字符串2返回值>0当字符串1<字符串2时返回值<0

桃花飞舞 发表于 2015-6-19 23:24:46

至于数字字符串为什么不按小到大排序我也很好奇。

桃花飞舞 发表于 2015-6-20 10:43:23

上边的程序不是按升序输出的,

溯月0503 发表于 2015-6-20 11:04:08

if(k!=i)是对上一个if语句的判断,当上一个if语句成立时k=i+1   这时需要交换两者位置

桃花飞舞 发表于 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,name) > 0)
                        {
                                temp = name;
                                name = name;
                                name = temp;
                        }
                }
        }
}
改下就对了

笨小孩KK 发表于 2015-6-20 21:26:18

桃花飞舞 发表于 2015-6-19 23:24
至于数字字符串为什么不按小到大排序我也很好奇。

字符串也不是不按小到大排序。很多网站给的是这个代码 但单步调试时 根本就不是按小到大排序

笨小孩KK 发表于 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>name   要交换,但只要k!=i 这个条件完全没有意义。 只要k被赋值过一次。在嵌套的第二个for循环中 k肯定不等于i啊 直到i在加1外面的循环 k才会重新等于i

笨小孩KK 发表于 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 ) 这个条件的出现。 是不是我哪里理解错误了。 还是那本身就是个错误的程序

桃花飞舞 发表于 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, name)>0)
                        {
                                k = j;
                        }
                        if( k!=i)
                        {
                                temp = name;
                                name=name;
                                name=temp;
                        }
                }
        }
}
是可以的

笨小孩KK 发表于 2015-6-21 12:00:37

我都醉了 怎么都是一些所问非所答的一些人 有什么高手解答一下

笨小孩KK 发表于 2015-6-21 12:03:44

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

那么不管name是否大于 namename和name都要交换那么这个程序还有什么字符串从小到大输出的意义 ,
怎么就可以的

桃花飞舞 发表于 2015-6-21 14:56:51

楼主说的对啊,问题是里边这句 k=i;应该在第二个for里边,第一个for 控制下沉趟数,第二个for控制每趟参与比较的元素个数.

桃花飞舞 发表于 2015-6-21 15:33:16

内层控制的是参与比较的字符串个数 首先改k = i 到内层循环,即每两个字符串比较前 if( k != i)是有效的。你觉得strcmp 的返回值是什么?strcmp返回的是字符串第一个不相同字符ASCII码的差值。也可以说strcmp -1 0 1.外层控制循环趟数 内层控制的是参与比较的字符串个数吧 然后(我是新手)

笨小孩KK 发表于 2015-7-9 12:48:30

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

大哥你把strcmp函数是什么意思 搞懂在说 你说的完全不明白 你的能把 代码打出来吗

风逝~ 发表于 2015-7-11 18:07:05

if( k != i )是说当k值不等于i是,!=是不等于的意思
页: [1]
查看完整版本: c 字符串从小到大输出的问题