/*******
【习题8.016】对字符串s1,除首、尾字符外,将其余字符
按ASCII码降序排列,组合成一个新的字符串s2。
**********/
void func(char *s1, char *s2)
{
int i,j,k,n;
for(i=0;s1[i]!='\0';i++);
n=i--;
for(i=0;i<n;i++)
s2[i]=s1[i];//如果这里用s2=s1,为何不行
//printf("%d%c",n,*s2);
for(i=1;i<n-1;i++)
for(j=1;j<n-i-1;j++)
{
k=*(s2+j)>*(s2+j+1)?*(s2+j):*(s2+j+1);
*(s2+j+1)=*(s2+j)>*(s2+j+1)?*(s2+j+1):*(s2+j);
*(s2+j)=k;
}//类似于冒泡法,先把相邻两个排序,多趟后完成整个数组的排序;可为什么在上面,如果把s2[i]=s1[i]所在的循环直接用s2=s1替换就不行,s2=s1,不就是把s1的地址传给s2,那不就是等于把s1的值附给s2了吗?求教!!!!!!!
}数组,s1和s2,
这里S1和S2是数组指针,你直接把S2=S1后源字符串S2的值就变了
学习了。。。
你程序哪里找的 有问题
第一 题目要求把去掉首尾的s1放入s2 你只去掉了尾没去掉首
应把第二个循环该为
for(i=0;i<n-1;i++)
s2[i]=s1[i+1];
或者直接用个函数strcpy不过得先加载个函数库“#include string.h”
void func(char *s1, char *s2)
{
int i,j,k,n;
for(i=0;s1[i]!='\0';i++);
n=i--;
s1[n]='\0';
strcpy(s2,s1+1);
第二 你冒泡排序有问题 完全在乱排应该是
for(i=1;i<n-1;i++)
for(j=n-1;j>i;j--)
if(s2[j]>s2[j-1])
{ k=s2[j];
s2[j]=s2[j+1];
s2[j+1]=k;
}
还有对你提的那个问题 2楼回答不对 s2是个不动的指针 s2=s1 是把s1指针变量单元的值赋给了S2指针变量单元那s2就指上了s1所指的数组 此时s1[i]就相当于s2[i]他们在内存中表示的同一个单元格 s2原来指的数组就在内存占着空间但没法用 浪费了 只有本函数运行完空间才被释放
最后给楼主说一句 不知道你学C多久了 基础很重要 学C一定要了解内存 要完全理解 不然以后走不远 一玩就死
非常感谢你的回答,我学c已有一学期了。基于你上面提出的几点问题,我不是很同意。
第一,是对题目的解读,可能是题目写的不够详细的缘故,我在试验的情况下得知其要求是把s1的所有元素都复制进s2,然后对s2进行排序,要求是首尾两个元素不参与排序,即其值不变。只对中间的数组排序。另外,我没有去掉尾,也没有去掉头。
第二:在后面排序中我并没有用冒泡法排序,只是吸收了它的精华,经测试,排序没有问题,(补充:我的这种方法与经典冒泡法哪个好?)
第三,也是我最关心的问题,就是在前面对s2进行复制操作时,既然“s2=s1 是把s1指针变量单元的值赋给了S2指针变量单元那s2就指上了s1所指的数组 此时s1[i]就相当于s2[i]他们在内存中表示的同一个单元格”那么为什么用这种方法,后面就不能得出准确的结果捏?求解!
@飞天狐: 先说第一个问题 你第一个循环让i是存字符“\0”的单元的下标 然后n=i-- 此时n是字符串数组的最后一个字符的下标 第二个循环
for(i=0;i<n;i++)
s2[i]=s1[i];
是让i从0跑到n-1此时你把S1[n-1]单元的值给了S2[n-1]单元然后i++ 此时i的值为n 条件i<n为假出循环 你的S1[n]单元的字符没赋给S2[n]单元就出了循环 尾字符就丢了 此时S2[n]单元存的是系统自动加的结束字符"\0"
第二个问题 你的循环肯定错了j一定是从后往前跑 否则每次外层i的循环只是把S2[i]和S2[i+1]两个单元中ASCII码大的字符放在了S2[i]中 并非把从i到n中的ASCII码最大单元的值给S[i]
最后那个问题 什么结果不正确 没懂 说清楚点
@福二摩斯: 是啊。那我第二个循环应该改为for(i=0;i<=n;i++)后面不变;
不过貌似后面没有问题啊,我后面排序的算法是这样的,首先对前面两个排序,即s2【1】和s2【2】,把小的放s2【2】中,然后在对s2【2】和s2【3】进行排序,同样把小的放后面,依次类推,那么当第一次循环结束时,最小的数就会被放在最后面,不过由于这题的限制,所以把最小的放倒数第二处,然后进行第二次循环,把最大的放在倒数第三处,以此类推,直到所有的数都排好序。
我上机试验过,结果正确。
至于最后一个问题是,如果我把前面中把s1数组中的数复制进s2数组的方法改成直接把s1的地址传给s2,就是s2 指向s1,这样不就相当于把s1中的值赋给s2了吗?可是试验不正确,不知为何?