首页 新闻 会员 周边

C语言指针初步,地址应用问题

0
[已关闭问题] 关闭于 2012-04-17 14:45

/*******
【习题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,

飞天狐的主页 飞天狐 | 菜鸟二级 | 园豆:208
提问于:2012-04-11 23:23
< >
分享
所有回答(3)
0

这里S1和S2是数组指针,你直接把S2=S1后源字符串S2的值就变了

artwl | 园豆:16736 (专家六级) | 2012-04-12 07:44
0

学习了。。。

KivenRo | 园豆:1734 (小虾三级) | 2012-04-12 09:11
0

你程序哪里找的 有问题

第一 题目要求把去掉首尾的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一定要了解内存 要完全理解 不然以后走不远 一玩就死

    

              

        

      

福二摩斯 | 园豆:202 (菜鸟二级) | 2012-04-12 17:35

非常感谢你的回答,我学c已有一学期了。基于你上面提出的几点问题,我不是很同意。

第一,是对题目的解读,可能是题目写的不够详细的缘故,我在试验的情况下得知其要求是把s1的所有元素都复制进s2,然后对s2进行排序,要求是首尾两个元素不参与排序,即其值不变。只对中间的数组排序。另外,我没有去掉尾,也没有去掉头。

第二:在后面排序中我并没有用冒泡法排序,只是吸收了它的精华,经测试,排序没有问题,(补充:我的这种方法与经典冒泡法哪个好?)

第三,也是我最关心的问题,就是在前面对s2进行复制操作时,既然“s2=s1 是把s1指针变量单元的值赋给了S2指针变量单元那s2就指上了s1所指的数组  此时s1[i]就相当于s2[i]他们在内存中表示的同一个单元格”那么为什么用这种方法,后面就不能得出准确的结果捏?求解!

支持(0) 反对(0) 飞天狐 | 园豆:208 (菜鸟二级) | 2012-04-12 21:25

@飞天狐: 先说第一个问题 你第一个循环让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]

最后那个问题  什么结果不正确 没懂 说清楚点

支持(0) 反对(0) 福二摩斯 | 园豆:202 (菜鸟二级) | 2012-04-12 22:51

@福二摩斯: 是啊。那我第二个循环应该改为for(i=0;i<=n;i++)后面不变;

不过貌似后面没有问题啊,我后面排序的算法是这样的,首先对前面两个排序,即s2【1】和s2【2】,把小的放s2【2】中,然后在对s2【2】和s2【3】进行排序,同样把小的放后面,依次类推,那么当第一次循环结束时,最小的数就会被放在最后面,不过由于这题的限制,所以把最小的放倒数第二处,然后进行第二次循环,把最大的放在倒数第三处,以此类推,直到所有的数都排好序。  

 我上机试验过,结果正确。

至于最后一个问题是,如果我把前面中把s1数组中的数复制进s2数组的方法改成直接把s1的地址传给s2,就是s2 指向s1,这样不就相当于把s1中的值赋给s2了吗?可是试验不正确,不知为何?

支持(0) 反对(0) 飞天狐 | 园豆:208 (菜鸟二级) | 2012-04-13 20:26
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册