关于字符串前导*的移动/删除的几种情况

1、编写一个程序把所有字符串的前导*保留,其他的*号都删除
效果:        ***shd***swbd*dwh  转换成  ***shdswbddwh 
算法分析,先研究一个字符串

 

char a[100]="***shd***swbd*dwh",b[100]="";
int  i,j,k=0;
puts(a);
for(i=0;a[i];i++)
{   
    if(a[i]!='*')
    {
        break; 
    }
    b[k++]=a[i];
}
for(j=i;a[j];j++)//下标跟随法
{
     if(a[j]=='*')
    {
        continue; 
    }
    b[k++]=a[j];
}
b[k]='\0';
puts(b);

如果是一个二维字符数组呢?
//前导*保留,后面出现的*全部删除




 

给定几个字符串,编写程序把字符串的前导*移动到末尾
***shd***swbd*dwh  转换成    shd***swbd*dwh*** 

char a[4][100]={"***sh**d","***sw76***b","***d*d*","**w12h***"};
int  i,j,k=0;
for(i=0;i<4;i++)
{  
    puts(a[i]);
}
puts("_______");
for(i=0;i<4;i++)
{   
    for(j=0;a[i][j];j++)//先考察第i个字符串a[i]
   { 
         if(a[i][j]!='*')//先要越过a[i]的前导*
         {
             break; 
         }
   }
   k=j;//让k与j同步,发生联系
   for(;a[i][j];j++)//下标跟随法
   {
        if(a[i][j]=='*')
        {
              continue; 
        }
        a[i][k++]=a[i][j];
   }
   a[i][k]='\0';
}
for(i=0;i<4;i++)//输出结果
{  
    puts(a[i]);
}

方法二
使用数组b来装入数组a

 

char a[4][100]={"***sh**d","***sw76***b","***d*d*","**w12h***"},b[4][100]={""};
int  i,j,k=0,m,t;
for(i=0;i<4;i++)
{  
    puts(a[i]);
}
puts("_______");
for(i=0;i<4;i++)
{   
    for(j=0;a[i][j];j++)//先考察第i个字符串a[i]
    { 
         if(a[i][j]!='*')//先要越过a[i]的前导*
        {
            break; 
        }

     }
    m=j;    
    k=0;
    for(;a[i][j];j++)//下标跟随法
    {
         b[i][k++]=a[i][j];
    }
    for(t=0;t<m;t++)
    {
        b[i][k++]='*';
    }
    b[i][k]='\0';
 }
    for(i=0;i<4;i++)
   {  
       puts(b[i]);
   }
/*方法二*/


char a[4][100]={"***sh**d","***sw76***b","***d*d*","**w12h***"};
int  i,j,k=0,m,t;
for(i=0;i<4;i++)
{  
    puts(a[i]);
}
puts("_______");
for(i=0;i<4;i++)
{   
      for(j=0;a[i][j];j++)//先考察第i个字符串a[i]
       { 
            if(a[i][j]!='*')//先要越过a[i]的前导*
           {
              break; 
           } 
      }
  //退出循环后,把j的值保存起来,移位需要差距
   k=j;//让k与j同步,发生联系
   for(;a[i][j];j++)//把后面元素向前移
   {
       a[i][j-k]=a[i][j];//a[i][0]
   }
//这时j已经跑到最后了,需要在字符串后面加上j-k个*号
   for(m=j-k;m<j;m++)//再加上前面的*号
   {
      a[i][m]='*';
   }
   a[i][j]='\0';
}
for(i=0;i<4;i++)
{  
    puts(a[i]);
}



给定几个字符串,编写程序把字符串的前导*移动到末尾,同时还要删除中间出现的*号
***shd***swbd*dwh  转换成   shdswbddwh*** 



char a[4][100]={"***sh**d","***sw76***b","***d*d*","**w12h***"},b[4][100]={""};
int  i,j,k=0,m,t;
for(i=0;i<4;i++)
{  
    puts(a[i]);
}
puts("_______");


for(i=0;i<4;i++)
{   
for(j=0;a[i][j];j++)//先考察第i个字符串a[i]
    { 
if(a[i][j]!='*')//先要越过a[i]的前导*
{
break; 
}

}
m=j;    
k=0;
for(;a[i][j];j++)//下标跟随法
    {
if(a[i][j]=='*')
{
continue;
}
b[i][k++]=a[i][j];
}
for(t=0;t<m;t++)
{
b[i][k++]='*';
}
b[i][k]='\0';
}
for(i=0;i<4;i++)
{  
puts(b[i]);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aFakeProgramer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值