鱼C论坛

 找回密码
 立即注册
查看: 1757|回复: 4

[已解决]这一个fun函数没有看懂

[复制链接]
发表于 2019-2-16 14:39:46 | 显示全部楼层 |阅读模式

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

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

x
void fun(char  (*ss)[N])
{  int  i, j, k=0, n, m, len;
   for(i=0; i<M; i++)
   {  len=strlen(ss[i]);
      if(i==0) n=len;
      if(len>n) {
/**********found**********/ 在这个for循环中,n应该是每一行中最长的字符串的长度,但不是很明白这个k是有什么作用。另外,怎么比较得出n的值呢??
         n=len;    k=i;
      }
   }
   for(i=0; i<M; i++)
    if (i!=k)
    { m=n;
      len=strlen(ss[i]);
/**********found**********/
      for(j=len; j>=0; j--)
         ss[i][m--]=ss[i][j];
      for(j=0; j<n-len; j++)
/**********found**********/
          ss[i][j]='*';
    }
}

代码中前两个for循环都不太明白,能不能详细地讲一讲?谢谢各位!!
最佳答案
2019-2-16 19:40:28
本帖最后由 jackz007 于 2019-2-16 23:48 编辑
void fun(char (*ss)[N])
{
        int i , j , k = 0 , n , m , len ;

// 遍历全部 N 个字符串,获取其中的最大长度记录在变量 n 中,对应的索引号记录在变量 k 中

        for(i = 0 ; i < N ; i ++) {
                len = strlen(ss[i])     ;
                if(i == 0) n = len      ;
                if(len > n) {
                        n = len         ;
                        k = i           ;
                }
        }

// 再次遍历所有字符串,根据索引号跳过长度最大的那一个,根据与最大长度的差距,确定字符串需要向后整体搬迁的距离,实施整体搬迁,然后把左侧空出的字符空间填充为字符 '*'

        for(i = 0 ; i < N ; i ++) {
                if (i != k) {                                                 // 只处理那些索引值不为 k 的字符串,也就是长度够不着最长值 n 的那些字符串
                        m = n                                              ;
                        len = strlen(ss[i])                                ;
                        for(j = len ; j >= 0 ; j --) ss[i][m--] = ss[i][j] ;  // 对字符串 ss[i] 按照由后向前的顺序逐字符整体向后迁移,跨度为 n - len 个字符,以便空出左面 n - len 个字符空间。
                        for(j = 0 ; j < n - len ; j ++) ss[i][j] = '*'     ;  // 在字符串左面已经空出来的 n - len 个空间中填充字符 '*' 
                }
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-2-16 15:36:44 | 显示全部楼层
本帖最后由 jackz007 于 2019-2-16 15:53 编辑

        你贴的东西太乱,看起来很费劲,按照代码贴出来再看看,重点是把代码缩进层次体现清楚,再说明一下这个函数的功能要求和希望达到的效果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-2-16 18:44:25 | 显示全部楼层
void fun(char  (*ss)[N])
{  int  i, j, k=0, n, m, len;
   for(i=0; i<M; i++)
   {  len=strlen(ss[i]);
      if(i==0) n=len;
      if(len>n) {
         n=len;    k=i;
      }
   }
   for(i=0; i<M; i++)
    if (i!=k)
    { m=n;
      len=strlen(ss[i]);
      for(j=len; j>=0; j--)
         ss[i][m--]=ss[i][j];
      for(j=0; j<n-len; j++)
          ss[i][j]='*';
    }
}

这个函数能够在左边填充*使得字符串数组里面的每一行字符串与最长的字符串对齐。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-16 19:40:28 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2019-2-16 23:48 编辑
void fun(char (*ss)[N])
{
        int i , j , k = 0 , n , m , len ;

// 遍历全部 N 个字符串,获取其中的最大长度记录在变量 n 中,对应的索引号记录在变量 k 中

        for(i = 0 ; i < N ; i ++) {
                len = strlen(ss[i])     ;
                if(i == 0) n = len      ;
                if(len > n) {
                        n = len         ;
                        k = i           ;
                }
        }

// 再次遍历所有字符串,根据索引号跳过长度最大的那一个,根据与最大长度的差距,确定字符串需要向后整体搬迁的距离,实施整体搬迁,然后把左侧空出的字符空间填充为字符 '*'

        for(i = 0 ; i < N ; i ++) {
                if (i != k) {                                                 // 只处理那些索引值不为 k 的字符串,也就是长度够不着最长值 n 的那些字符串
                        m = n                                              ;
                        len = strlen(ss[i])                                ;
                        for(j = len ; j >= 0 ; j --) ss[i][m--] = ss[i][j] ;  // 对字符串 ss[i] 按照由后向前的顺序逐字符整体向后迁移,跨度为 n - len 个字符,以便空出左面 n - len 个字符空间。
                        for(j = 0 ; j < n - len ; j ++) ss[i][j] = '*'     ;  // 在字符串左面已经空出来的 n - len 个空间中填充字符 '*' 
                }
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2019-2-17 15:57:16 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-3 08:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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