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 )
strcmp(字符数组名1,字符数组名2)按照ASCII码顺序比较两个数组中字符串,并返回比较结果当字符串1=字符串2是返回值0当字符串1>字符串2返回值>0当字符串1<字符串2时返回值<0 至于数字字符串为什么不按小到大排序我也很好奇。 上边的程序不是按升序输出的, if(k!=i)是对上一个if语句的判断,当上一个if语句成立时k=i+1 这时需要交换两者位置 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;
}
}
}
}
改下就对了 桃花飞舞 发表于 2015-6-19 23:24
至于数字字符串为什么不按小到大排序我也很好奇。
字符串也不是不按小到大排序。很多网站给的是这个代码 但单步调试时 根本就不是按小到大排序 溯月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
桃花飞舞 发表于 2015-6-20 11:06
void sort(char *name[], int n)
{
char *temp;
我知道这样改是对。我只是不明白为什么if( k != i ) 这个条件的出现,而且在很多的网站给的标准答案中都有if( k != i ) 这个条件的出现。 是不是我哪里理解错误了。 还是那本身就是个错误的程序 基于 :在嵌套的第二个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;
}
}
}
}
是可以的 我都醉了 怎么都是一些所问非所答的一些人 有什么高手解答一下
桃花飞舞 发表于 2015-6-21 09:08
基于 :在嵌套的第二个for循环中 k肯定不等于i啊 直到i在加1外面的循环 k才会重新等于i .得到
void sort(c ...
那么不管name是否大于 namename和name都要交换那么这个程序还有什么字符串从小到大输出的意义 ,
怎么就可以的 楼主说的对啊,问题是里边这句 k=i;应该在第二个for里边,第一个for 控制下沉趟数,第二个for控制每趟参与比较的元素个数. 内层控制的是参与比较的字符串个数 首先改k = i 到内层循环,即每两个字符串比较前 if( k != i)是有效的。你觉得strcmp 的返回值是什么?strcmp返回的是字符串第一个不相同字符ASCII码的差值。也可以说strcmp -1 0 1.外层控制循环趟数 内层控制的是参与比较的字符串个数吧 然后(我是新手) 桃花飞舞 发表于 2015-6-21 15:33
内层控制的是参与比较的字符串个数 首先改k = i 到内层循环,即每两个字符串比较前 if( k != i)是有效的 ...
大哥你把strcmp函数是什么意思 搞懂在说 你说的完全不明白 你的能把 代码打出来吗 if( k != i )是说当k值不等于i是,!=是不等于的意思
页:
[1]